关于 Java 中的泛型数组创建

2024-04-04

刚刚发现一行代码我不太明白。

List<String>[] stringLists = new List[1];

尽管有警告,这一行可以在我的 AndroidStudio IDE 上通过编译。这似乎违反了面向对象语言的基本规则:“超类对象可以用子类实例实例化,但反之则不行。”

String[] ss = new Object[1];  // won't compile

我们知道 List 是任何泛型 List 类型的超类型,例如List<String>在这种情况下。由于数组是协变的,所以我认为 List[] 类型是超级的List<String>[]类型。为什么List<String>[]可以实例化为List[]?


我觉得JLS,§4.8,“原始类型” https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.8回答你的实际问题why分配有效:

仅允许使用原始类型作为对遗留代码兼容性的让步。强烈建议不要在 Java 编程语言中引入泛型之后编写的代码中使用原始类型。 Java 编程语言的未来版本可能会禁止使用原始类型。

它是为了与预泛型代码兼容。一般来说,如果你想要类型安全,你根本不应该使用参数化类型的数组,如果作者写道:

List<List<String>> lists = new ArrayList<>();

您关于违反类型安全规则的假设是错误的。你是这么说的List不是 的子类型List<String>。然而,在 Java 类型系统中,问题的答案是:“是List的一个子类型List<String>?”既不是“是”,也不是“否”,而是“这个问题无法回答”。

(It's also probably not correct to conflate "types" and "classes." There is only one List class, but List<String> and List<Object> are different types. Bonus: List<String> is not a subtype of List<Object>.)


为了添加有关所发生情况的更多详细信息,JLS 解释了变量赋值中允许进行哪些转换§5.2,“赋值上下文” https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.2。值得注意的是,该列表以以下内容结尾:

如果在应用上面列出的转换后,结果类型是原始类型(§4.8 https://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.8),未经检查的转换(§5.1.9 https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.9)然后可以应用。

后者链接到§5.1.9,“未经检查的转换” https://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.9在一些形式主义解释了什么是未经检查的转换之后,重申了基本原理(强调我的):

使用未经检查的转换来实现遗留代码的平滑互操作,在引入泛型类型之前编写,其中的库已经经过转换以使用泛型(我们称之为泛型化的过程)。在这种情况下(最值得注意的是,Collections Framework 的客户java.util),遗留代码使用原始类型(例如Collection代替Collection<String>)。原始类型的表达式作为参数传递给库方法,这些方法使用这些相同类型的参数化版本作为其相应形式参数的类型。

在使用泛型的类型系统下,此类调用不能被证明是静态安全的。拒绝此类调用将使大量现有代码无效,并阻止它们使用较新版本的库。这反过来又会阻止库供应商利用通用性。为了防止这种不受欢迎的事件发生,原始类型可以转换为原始类型所引用的泛型类型声明的任意调用。虽然这种转变并不健全,但作为对实用性的让步,它是可以容忍的。在这种情况下,会发出未经检查的警告。

官方的说法确实是,从原始类型到参数化类型的未经检查的转换被故意添加到语言中,尽管可能不安全,并且出于兼容性原因仅标记有编译警告。 (Java 非常努力确保在版本 X 中编译的代码永远不会在版本 X+1 中编译失败或不再有用。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于 Java 中的泛型数组创建 的相关文章

  • createImage(int width, int height) 的问题

    我有以下代码 作为游戏的一部分每 10 毫秒运行一次 private void gameRender if dbImage null createImage returns null if GraphicsEnvironment isHea
  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 不同类型的数组

    是否可以有一个包含两种不同类型数据的数组 我想要一个包含双精度型和字符串的数组 我尝试过 ArrayList
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 需要使用 joda 进行灵活的日期时间转换

    我想使用 joda 解析电子邮件中的日期时间字符串 不幸的是我得到了各种不同的格式 例如 Wed 19 Jan 2011 12 52 31 0600 Wed 19 Jan 2011 10 15 34 0800 PST Wed 19 Jan
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • 生成的序列以 1 开头,而不是注释中设置的 1000

    我想请求一些有关 Hibernate 创建的数据库序列的帮助 我有这个注释 下面的代码 在我的实体类中 以便为合作伙伴表提供单独的序列 我希望序列以 1000 开头 因为我在部署期间使用 import sql 将测试数据插入数据库 并且我希
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • 在 SWT/JFace RCP 应用程序中填充巨大的表

    您将如何在 SWT 表中显示大量行 巨大是指超过 20K 行 20 列的东西 不要问我为什么需要展示那么多数据 这不是重点 关键是如何让它尽可能快地工作 这样最终用户就不会厌倦等待 每行显示某个对象的实例 列是其属性 一些 我想使用 JFa
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • Java中HashMap和ArrayList的区别?

    在爪哇 ArrayList and HashMap被用作集合 但我不明白我们应该在哪些情况下使用ArrayList以及使用时间HashMap 他们两者之间的主要区别是什么 您具体询问的是 ArrayList 和 HashMap 但我认为要完
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数
  • Java EE 目录结构

    我对以下教程有疑问 http www mkyong com jsf2 jsf 2 internationalization example http www mkyong com jsf2 jsf 2 internationalizatio

随机推荐

  • 屏幕截图安全桌面

    我正在处理屏幕共享项目 我正在使用以下功能捕获桌面屏幕 它工作正常 但每当安全桌面提示提升 https learn microsoft com en us windows security threat protection securit
  • 我如何在asp.net core 2.2中实现Cookie基础身份验证和jwt?

    我想同时使用基于 cookie 的身份验证和jwt在我的程序中 使用身份验证用户来访问mvc具有登录名和 JWT 的控制器来访问 WebApi 资源 我尝试使用其中两个首先 我的客户端可以使用用户名和密码登录并通过 cookie 进行身份验
  • 运行 ng new 命令时茉莉花版本错误

    我在运行 ng new 命令时遇到错误 在 ng new Project Name Here 期间触发以下错误 无法解决依赖关系 错误同级 jasmine core gt 3 7 1 来自 电子邮件受保护 cdn cgi l email p
  • 使用 TOpenDialog 选择目录

    我真的很想知道使用 TOpenDialog 选择目录的各种方法 无论是下载新组件还是使用 Delphi 提供的内容 但最好使用 Delphi 提供的内容 在此之前 我一直在使用 SelectDirectory 命令 但我认为对于我的程序的用
  • 如何在Python中使库异步

    在我的工作中 他们 利用 龙卷风 但他们没有异步库 是什么让库变得异步 以便它更适合龙卷风之类的东西 有没有什么好的例子或者我猜你在做什么 enter or exit 这可以表明您没有阻止 我发现很难将一些材料拼凑在一起 如果您的库不是异步
  • 如果定义了构造函数,pytest 跳过测试类

    我有以下通过 py test 运行的单元测试代码 构造函数的存在会使整个类在运行时跳过 py test v s 已收集 0 件 已跳过 1 件 谁能向我解释 py test 的这种行为吗 我有兴趣了解 py test 行为 我知道不需要构造
  • UITextView文本背景颜色

    我正在尝试获得一个透明的 UITextView 并且我知道如何设置它 我还想要的是在已显示的文本下方有一个彩色背景 同样 文本视图背景会将整个视图矩形设置为给定的颜色 我想要的是文本下方的颜色 有什么简单的方法可以实现这样的目标吗 据我所知
  • 有没有办法在提供左值和右值重载的同时删除重复代码?

    在学习 C 时 我决定编写一个简单的模板化二叉搜索树 bst 并遇到以下问题 我希望能够构造通过向其传递一个左值来实现 bst 例如const T val和一个像这样的右值T val 同样我希望能够insert左值和右值 所以我最终得到了很
  • getChildFragmentManager() 和 viewpager

    我有同样的问题导航回 FragmentPagerAdapter gt 片段为空 https stackoverflow com questions 17672779 navigating back to fragmentpageradapt
  • Javascript 中的链表与数组

    所以我在 JS 中玩弄链表并提出以下问题 假设我们有一个数组和一个链表 都有 5000 个元素 我们想在索引 10 处插入新元素 数组方式非常简单 我们在给定索引处插入新元素 并将其余元素向前移动一个索引 所以我尝试用链表来做到这一点 并以
  • Django SplitDateTime 小部件抛出“列表”对象没有属性“条带”

    我正在尝试使用 django 创建具有开始日期时间和结束日期时间的事件 在表单中 我尝试使用 AdminSPlitDateTime 小部件分隔日期和时间输入 我希望有一些 JS 用于输入 当我尝试创建事件时 django 给我 list 对
  • IntelliJ DataGrip 如何启用添加行?

    我使用 DataGrip 有几天了 我真的很喜欢它 但它有一个可疑的行为 在我打开的某些表中 我无法添加新行 在同一数据库的其他表中它工作正常 添加行按钮已禁用 因此我无法添加新行 如果表中有行 我可以删除它们 但仍然无法添加新行 我在网上
  • ionic 应用程序构建失败,并显示错误“链接器命令失败,退出代码 1(使用 -v 查看调用)”

    当尝试使用构建时ionic run ios lc我在终端中看到以下错误 BUILD FAILED The following build commands failed Ld build emulator xXxXxXx app xXxXx
  • 如何在没有服务器或服务器端脚本的情况下创建动态访问数据库的内联网网站?

    问题是 必须在没有服务器托管的情况下创建 Intranet 网页 并且我一直在尝试使用 HTML 和 javascript 更新 Access 数据库 但这不适用于以下代码 请帮助 当以下代码从 Visual Studio 运行时 出现错误
  • 无法找到 actionbarsherlock.apk

    我正在尝试从 Eclipse 在真实设备上运行我的应用程序 添加 actionbarsherlock 作为参考后 我无法摆脱此错误 Could not find actionbarsherlock apk 这是完整的控制台输出 2013 0
  • 动态生成的按钮,点击后不被执行

    我需要生成一个动态按钮列表 我已经这样做了 并附加了一个事件处理程序 但是事件处理程序并未被执行 private void GetOptions EcoBonusRequest request var ecobonuswworkflow W
  • WiX:如果虚拟目录包含嵌套目录,如何跳过删除 iis:WebVirtualDir?

    我的msi安装和卸载共享资源 IIS虚拟目录 MyTeamServices 它工作得很好 除了在卸载过程中删除该虚拟目录 即使有人创建了嵌套虚拟目录 不是通过使用安装程序 只是 手动 当我期望看到 WiX 处理 HDD 文件夹的标准行为时
  • 饼图、条形图、线条:SVG/VML 优于 Canvas

    我需要选择一个用于 标准 图表的库 饼图 折线图和条形图 根据我的阅读 在我看来最好的格式是 SVG VML 例如 Highcharts 现在 IE 9 接受了 SVG 它正在成为所有主要浏览器的标准 重新缩放和导出似乎比 Canvas 更
  • 创建多个线程并等待所有线程完成

    如何创建多个线程并等待所有线程完成 这取决于您使用的 NET Framework 版本 NET 4 0 使用任务使线程管理变得更加容易 class Program static void Main string args Task task
  • 关于 Java 中的泛型数组创建

    刚刚发现一行代码我不太明白 List