java - 为什么菱形运算符用于 Java 7 中的类型推断?

标签 java java-7 type-inference diamond-operator

List<String> list = new ArrayList();将导致编译器警告。

但是下面的例子编译时没有任何警告:List<String> list = new ArrayList<>();

我很好奇为什么需要引入钻石运算符。如果类型参数不存在,为什么不对构造函数进行类型推断(因为它已经在 java 中为静态方法完成并被 google guava 等集合库利用)

EDIT:使用 millimoose 答案作为起点,我查看了实际上是什么类型删除,它不仅仅是删除所有类型信息。编译器实际上做了更多(从 official doc 复制):

  • 如果类型参数是无界的,则将泛型类型中的所有类型参数替换为它们的边界或 Object。因此,生成的字节码仅包含普通类、接口(interface)和方法。
  • 必要时插入类型转换以保持类型安全。
  • 生成桥接方法以在扩展泛型类型中保留多态性。

最佳答案

明确的答案必须来自设计该功能的人,但我假设这是为了将其与使用原始类型区分开来,这使得编译器为了兼容性而做一些完全不同的事情。其中包含原始类型的表达式的处理方式巧妙地与涉及泛型的表达式不同,在这个 SO 问题中可以找到一个示例:Generic screws up non-related collection

关于java - 为什么菱形运算符用于 Java 7 中的类型推断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909875/

相关文章:

java - 无法访问 jar 文件? [Ubuntu、Linux]

generics - Dart 泛型类实例化

java - 如何修复已弃用的 .getDate()

Java 7u4 webstart 安全异常 : Class does not match trust level

java - 将异常重新分配给 catch 参数

java - 使用键盘关闭 JFrame

go - 分配空 slice 而不引用其类型?

scala - 修复更高种类类型的类型推断

java - 是否应该使用 HTTP 代码来表示业务失败?

java - JTextField 上的序列结果