List<String> list = new ArrayList();
приведет к предупреждению компилятора.
Однако следующий пример компилируется без предупреждения: List<String> list = new ArrayList<>();
Мне любопытно, почему вообще требуется внедрение алмазного оператора. Почему бы просто не вводить тип в конструкторе, если аргумент типа отсутствует (как это уже сделано для статических методов в java и используется библиотеками коллекции, такими как google guava)
РЕДАКТИРОВАТЬ. Используя миллимозный ответ в качестве отправной точки, я посмотрел, что такое стирание на самом деле, и оно не просто удаляет всю информацию о типе. Компилятор на самом деле немного больше (скопирован из официальный документ):
- Замените все параметры типа в родовых типах своими границами или объектом, если параметры типа не ограничены. Таким образом, полученный байт-код содержит только обычные классы, интерфейсы и методы.
- Вставьте тип при необходимости, чтобы сохранить безопасность типа.
- Создание мостовых методов для сохранения полиморфизма в расширенных общих типах.