【发布时间】:2014-04-07 16:21:48
【问题描述】:
考虑这个试图实例化一些Lists的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
那么,有了list4 的声明,为什么菱形运算符不能与匿名类一起使用呢?有一个similar question here 接受的答案包含来自JSR-334 的以下解释:
不支持使用带有匿名内部类的菱形,因为 这样做通常需要对类文件进行扩展 表示不可表示类型的签名属性,事实上的 JVM 改变。
我需要一些帮助来理解这个推理。为什么显式类型与相同且显然很容易推断的类型需要在生成的类文件中有任何差异? “一般情况下”会涵盖哪些困难的用例?
造成这种情况的根本原因是什么?
【问题讨论】:
-
这不是该特定问题的重复。我引用了一个类似的问题,但需要对答案进行解释(或更好的答案)。
-
您链接到的答案对您引用的段落的含义给出了“最佳猜测”。你不明白什么?您想要更可靠的答案吗?
-
感谢@Rafik991,我也阅读了那个答案,但它并没有真正帮助理解任何奇怪的用例。
-
@Radiodef 链接答案中的最佳猜测并没有真正涵盖为什么编译器不能(或选择不)推断正确的类型。一旦知道类型,生成的类应该是相同的。或者也许不是——在这种情况下,任何额外的解释都会有所帮助。
标签: java java-7 diamond-operator