В 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, в котором говорится, что этот синтаксис неприемлем, но я не могу его найти. Может ли кто-нибудь указать мне на это?