List<String> list = new ArrayList();
会导致编译器警告。
然而,以下示例可以编译而没有任何警告:List<String> list = new ArrayList<>();
我很好奇为什么需要引入钻石操作符。如果构造函数中缺少类型参数,为什么不能像Java中的静态方法一样进行类型推断(这已经是Java中的做法,并被集合库如Google Guava所利用)?
编辑:以millimoose的答案为起点,我查看了类型擦除实际上是什么,它不仅仅是删除所有类型信息。编译器实际上还做了更多的工作(摘自官方文档):
- 将泛型类型中的所有类型参数替换为其边界或Object(如果类型参数未加限定)。因此,生成的字节码只包含普通类、接口和方法。
- 必要时插入类型转换以维护类型安全性。
- 生成桥接方法以保留扩展泛型类型中的多态性。
only
)并不合适。 - Petro SemeniukObject s = new ArrayList().get()
这样的语句,其结果类型会使用预泛型算法来解析,与String s = new ArrayList<String>().get()
不同。如果将ArrayList
存储在中间变量中,也会出现这种情况。 - millimoose