在Java 1.7.0_55中,如果我编写此字段声明,则会收到编译错误(“不兼容的类型”):
private final Map<String,Object> myMap =
Collections.synchronizedMap(new HashMap<>());
如果我将其改为:
private final Map<String,Object> myMap =
Collections.synchronizedMap(new HashMap<String,Object>());
它编译良好。(我在这里以syncedMap为例,但对于其他Collections方法,unmodifiable *,synchronized *等也是如此)
但是,为什么钻石操作员不能像我在这里期望的那样工作?由于Collections.synchronizedMap()声明为:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
在我看来,构造函数调用的类型参数必须与字段声明的类型参数相同,并且编译器应该能够基于此推断构造的类类型参数。
我尝试在JLS中寻找一个子句,该子句说这种语法是不可接受的,但是找不到。谁能指出我的意思?
这会因Java 7中的编译器错误而失败,但会在Java 8中成功编译。简而言之,编译器的类型推断未捕获Java 7中正确的推断类型,但更好的类型推断会推断Java 8中的正确类型。
摘要
平稳地扩展方法类型推断的范围,以支持(i)方法上下文中的推断和(ii)链式调用中的推断。
Java 8能够通过带有参数和方法调用链的多个方法调用来推断类型。现在,它可以从分配的左侧<String, Object>
通过调用Collections.synchronizedMap
的参数中的菱形运算符的调用来确定new HashMap<>()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句