Инициализация двойной скобки (анонимный внутренний класс) с алмазным оператором
Мне интересно, почему вторая декларация карты (с использованием оператора алмаза) не компилируется, когда первая делает. Ошибка компиляции:
error: не может вызывать аргументы типа для HashMap; Map map2 = new HashMap < > () { Причина: не может использовать '< > ' с анонимными внутренними классами где K, V - переменные типа: K extends Объект, объявленный в классе HashMap V extends Объект, объявленный в классе HashMap
код:
Map<String, String> map1 = new HashMap<String, String>() { //compiles fine
{
put("abc", "abc");
}
};
Map<String, String> map2 = new HashMap<>() { //does not compile
{
put("abc", "abc");
}
};
ИЗМЕНИТЬ
Спасибо за ваши ответы - я должен был лучше прочитать ошибку компиляции.
Я нашел exaplanation в JLS
Это ошибка времени компиляции, если выражение создания экземпляра класса объявляет анонимный класс, используя форму "< > " для аргументов типа класса.
Ответы
Ответ 1
У вас нет статического инициализатора (ключевое слово static отсутствует вообще).
В основном вы создаете новый анонимный подкласс HashMap
и определяете здесь блок intializer экземпляра. Btw, это работает только с HashMap
не является окончательным.
Поскольку вы получите анонимный подкласс HashMap
, оператор алмаза здесь не работает, так как подкласс будет скомпилирован так, как если бы вы написали ... extends HashMap<Object, Object>
, и это явно не совместимо с Map<String, String>
.
Ответ 2
Алгоритм не работает для создания анонимных классов, что вы здесь делаете.
Попробуйте следующее:
Map<String, String> map1 = new HashMap<>();
{
map1.put("abc", "abc");
}
Ответ 3
Эта функция является частью Project Coin 2 и будет доступна в Java 9, которая состоится 22 сентября 2016 года.
Он вызывает Allowing the diamond syntax with some anonymous class
constructors
.
Ссылка.
Ответ 4
Обратите внимание, что вы также можете опустить алмаз. Тем не менее, хотя это компилируется, это происходит только потому, что он игнорирует дженерики Java и опирается на то, что Java обратно совместима с предыдущими версиями.
Map<String, String> map1 = new HashMap() { //compiles fine
{
put("abc", "abc");
}
};