为什么 Java 7 钻石运算符不能与匿名类一起使用?
考虑以下 Java 代码,它尝试实例化一些 s:List
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
并且直截了当; 在 Java 7 中使用新的菱形运算符来减少类型参数的不必要重复。list2
list2
list3
是使用匿名类的变体,可能会覆盖 的某些方法。list1
ArrayList
list4
尝试使用菱形运算符,类似于 ,但这是一个编译错误,消息“<>”不能与匿名类一起使用。list2
list5
产生一个错误,证明编译器知道实际需要哪种类型。错误消息是类型不匹配: 无法从新的 ArrayList<Integer>(){} 转换为 List<String>
那么,有了 的声明,为什么钻石运算符不能与匿名类一起使用呢?这里有一个类似的问题,其中包含一个被接受的答案,其中包含JSR-334的以下解释:list4
不支持将菱形与匿名内部类一起使用,因为这样做通常需要扩展类文件签名属性以表示不可识别的类型,这是事实上的 JVM 更改。
我需要一些帮助来理解这种推理。为什么显式类型与相同且显然容易推断的类型需要在生成的类文件中有任何差异?“一般情况下这样做”将涵盖哪些困难的用例?