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