为什么在 Java 7 中将菱形运算符用于类型推断?
List<String> list = new ArrayList();
将导致编译器警告。
但是,以下示例在编译时没有任何警告:List<String> list = new ArrayList<>();
我很好奇为什么需要引入钻石操作员。如果类型参数不存在,为什么不直接在构造函数上进行类型推断(因为它已经为java中的静态方法完成了,并被google guava等集合库所利用)
编辑:使用毫摩尔斯答案作为起点,我研究了类型擦除实际上是什么,它不仅仅是删除所有类型信息。编译器实际上做得更多(从官方文档复制):
- 如果类型参数未绑定,则将泛型类型中的所有类型参数替换为其边界或 Object。因此,生成的字节码仅包含普通类、接口和方法。
- 如有必要,插入类型转换以保持类型安全。
- 生成桥接方法以保持扩展泛型类型中的多态性。