Подтвердить что ты не робот

Инициализация двойной скобки (анонимный внутренний класс) с алмазным оператором

Мне интересно, почему вторая декларация карты (с использованием оператора алмаза) не компилируется, когда первая делает. Ошибка компиляции:

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

Это ошибка времени компиляции, если выражение создания экземпляра класса объявляет анонимный класс, используя форму "< > " для аргументов типа класса.

4b9b3361

Ответ 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");
    }
};