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