Выбор ответа Junior Дженерики и стирание спрашивают часто обновлено

List<Integer> и List<Number>

Вопрос

Скомпилируется ли List<Number> nums = new ArrayList<Integer>();?

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

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

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

Коротко

Правильный ответ: Нет: дженерики инвариантны, List<Integer не List<Number. Если бы присваивание было разрешено, через nums можно было бы добавить Double в список целых.

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

  1. Нет: дженерики инвариантны, List<Integer> не List<Number>правильный ответ
  2. Да: Integer наследник Number, значит и списки совместимы
  3. Да, но компилятор выдаст предупреждение unchecked conversion
  4. Да, но при добавлении Double упадёт с ClassCastException

Разбор

Если бы присваивание было разрешено, через nums можно было бы добавить Double в список целых. Поэтому параметризованные типы инвариантны и компилятор это запрещает. Нужен List<? extends Number>. Ковариантны массивы, там аналогичная ошибка ловится в рантайме через ArrayStoreException.

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

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