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

Почему не может использоваться алмазный оператор Java 7 с анонимными классами?

Рассмотрим этот Java-код, который пытается создать экземпляр некоторого List s:

List<String> list1 = new ArrayList<String>();
List<String> list2 = new ArrayList<>();
List<String> list3 = new ArrayList<String>() { };
List<String> list4 = new ArrayList<>() { };
List<String> list5 = new ArrayList<Integer>() { };

list1 и list2 просты; list2 использует новый оператор алмаза в Java 7, чтобы уменьшить ненужное повторение параметров типа.

list3 является вариацией на list1 с использованием анонимного класса, возможно, чтобы переопределить некоторые методы ArrayList.

list4 пытается использовать оператор алмаза, аналогичный list2, но это ошибка компиляции, при этом сообщение '< > ' не может использоваться с анонимными классами.

list5 создает ошибку, которая доказывает, что компилятор знает, какой тип на самом деле нужен. Сообщение об ошибке - несоответствие типа: невозможно преобразовать из нового массива ArrayList () {} в список

Итак, с объявлением list4, почему оператор алмаза не может использоваться с анонимными классами? Здесь есть аналогичный вопрос с принятым ответом, который содержит следующее объяснение от JSR-334:

Использование алмаза с анонимными внутренними классами не поддерживается, поскольку для этого в общем случае потребуется расширение файла класса атрибут подписи для представления недентифицируемых типов, де-факто JVM изменение.

Мне нужна помощь, чтобы понять это рассуждение. Почему явный тип в сравнении с идентичным и, по-видимому, легко выводимым типом, требует какой-либо разницы в результирующем файле класса? Какой трудный случай использования будет охватываться "делать это вообще"?

В чем причина этого?

4b9b3361

Ответ 1

Это обсуждалось в в списке рассылки "Project Coin" . По существу (внимание мое):

Внутри, компилятор Java работает над более богатым набором типов, чем те, которые могут быть записаны явно в программе Java. внутренние типы компилятора, которые не могут быть записаны в программе Java, называемых недентифицируемыми типами. В качестве результата могут возникнуть недентифицируемые типы вывода, используемого алмазом. Поэтому, используя алмаз с анонимные внутренние классы не поддерживаются, поскольку требуют расширения для атрибута подписи файла класса для представления недентифицируемые типы, фактическое изменение JVM. Возможно, что будущее версии платформы могут позволить использовать алмаз при создании анонимного внутренний класс, если предполагаемый тип был обозначен.

Обратите внимание, что он не поддерживается в Java 8, но будет включен как новая функция в Java 9 (пункт 3 "Milling Project Coin" ).

Ответ 2

Вы можете использовать алмазный оратор в Java9

MyHandler<Integer> intHandler = new MyHandler<>(1) {

        @Override
        public void handle() {
            // handling code...
        }
    };

    MyHandler<? extends Integer> intHandler1 = new MyHandler<>(10) {

        @Override
        void handle() {
            // handling code...
        }
    };

    MyHandler<?> handler = new MyHandler<>("One hundred") {

        @Override
        void handle() {
            // handling code...
        }
    };
}

Ответ 3

Вы можете использовать его в java 9 Пример оператора Diamond

 MyHandler<Integer> intHandler = new MyHandler<>(1) {

        @Override
        public void handle() {
            // handling code...
        }
 };