Выбор ответа Junior Дженерики и стирание спрашивают часто обновлено
List<Integer> и List<Number>
Вопрос
Скомпилируется ли List<Number> nums = new ArrayList<Integer>();?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Нет: дженерики инвариантны, List<Integer не List<Number. Если бы присваивание было разрешено, через nums можно было бы добавить Double в список целых.
Варианты ответа
- Нет: дженерики инвариантны,
List<Integer>неList<Number>правильный ответ - Да:
IntegerнаследникNumber, значит и списки совместимы - Да, но компилятор выдаст предупреждение unchecked conversion
- Да, но при добавлении
Doubleупадёт с ClassCastException
Разбор
Если бы присваивание было разрешено, через nums можно было бы добавить Double в список целых. Поэтому параметризованные типы инвариантны и компилятор это запрещает. Нужен List<? extends Number>. Ковариантны массивы, там аналогичная ошибка ловится в рантайме через ArrayStoreException.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.