考虑这段试图实例化一些List
的 Java 代码:
List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<String>() { };
List<String> list4 = new ArrayList<>() { };
List<String> list5 = new ArrayList<Integer>() { };
list1
和list2
很简单;list2
使用Java 7中的钻石操作符来减少类型参数不必要的重复。
list3
是对list1
的变体,使用匿名类,可能会覆盖一些ArrayList
的方法。
list4
试图使用钻石操作符,类似于list2
,但这是一个编译错误,消息为“'<'>'不能与匿名类一起使用”。
list5
产生了一个错误,证明编译器知道实际需要的类型。错误消息是“类型不匹配:无法将new ArrayList<Integer>(){}转换为List<String>”。因此,在
list4
的声明中,为什么不能在匿名类中使用钻石操作符?有一个类似的问题,其中有一个被接受的答案,包含来自JSR-334的以下解释:“在匿名内部类中使用钻石是不支持的,因为通常情况下,这样做需要扩展类文件签名属性以表示不可表示的类型,这是一种事实上的JVM更改。”
我需要一些帮助理解这个论据。为什么显式类型与相同且明显容易推断出的类型需要在生成的类文件中有任何差异?“通常情况下这样做”的困难用例将涵盖什么?