考虑这个试图实例化一些List
s 的 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
,但这是一个编译错误,消息'<>' cannot be used with anonymous classes。
list5
产生一个错误,证明编译器知道实际需要什么类型。错误消息是Type mismatch: cannot convert from new ArrayList<Integer>(){} to List<String>
那么,有了 的声明list4
,为什么菱形运算符不能与匿名类一起使用呢?这里有一个类似的问题,其中包含来自JSR-334的以下解释的已接受答案:
不支持将 diamond 与匿名内部类一起使用,因为这样做通常需要对类文件签名属性进行扩展以表示不可表示的类型,这是事实上的 JVM 更改。
我需要一些帮助来理解这个推理。为什么显式类型与相同且显然很容易推断的类型需要在生成的类文件中存在任何差异?“一般情况下”将涵盖哪些困难的用例?