Выбор ответа Senior Дженерики и стирание обновлено
Heap pollution через сырой тип
Вопрос
Где упадёт программа?
List<String> strings = new ArrayList<>();
List raw = strings;
raw.add(42);
String s = strings.get(0);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: В строке 4 с ClassCastException. Через сырой тип List компилятор разрешает добавить Integer в список строк (только предупреждение unchecked).
Варианты ответа
- В строке 2: нельзя присвоить сырой список
- В строке 3 с ClassCastException
- Нигде, напечатается 42
- В строке 4 с ClassCastExceptionправильный ответ
Разбор
Через сырой тип List компилятор разрешает добавить Integer в список строк (только предупреждение unchecked). В рантайме список хранит Object, поэтому строка 3 проходит. При чтении strings.get(0) компилятор вставил приведение к String, оно и падает в строке 4: далеко от места, где на самом деле ошиблись. Это heap pollution.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.