在 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>());
它正常编译。(这里以synchronizedMap作为例子,但对其他Collections方法如unmodifiable*、synchronized*等也适用)
但是我为什么在这里使用钻石操作符不像我预期的那样起作用呢? 因为Collections.synchronizedMap()被声明为:
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) {
在我看来,构造函数调用的类型参数必须与字段声明的类型参数相同,并且编译器应该能够基于此推断出构造类的类型参数。
我尝试查找JLS中是否有规定此语法是不可接受的条款,但我找不到。有人能指引我吗?