Выбор ответа Senior Дженерики и стирание обновлено

Heap pollution через сырой тип

Вопрос

Где упадёт программа?

List<String> strings = new ArrayList<>();
List raw = strings;
raw.add(42);
String s = strings.get(0);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: В строке 4 с ClassCastException. Через сырой тип List компилятор разрешает добавить Integer в список строк (только предупреждение unchecked).

Варианты ответа

  1. В строке 2: нельзя присвоить сырой список
  2. В строке 3 с ClassCastException
  3. Нигде, напечатается 42
  4. В строке 4 с ClassCastExceptionправильный ответ

Разбор

Через сырой тип List компилятор разрешает добавить Integer в список строк (только предупреждение unchecked). В рантайме список хранит Object, поэтому строка 3 проходит. При чтении strings.get(0) компилятор вставил приведение к String, оно и падает в строке 4: далеко от места, где на самом деле ошиблись. Это heap pollution.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.