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

new T()

Вопрос

Почему внутри class Box<T> нельзя написать new T()?

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

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

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

Коротко

Правильный ответ: Из-за стирания тип T неизвестен в рантайме, поэтому создать объект нельзя. В рантайме T стёрт до своей границы, JVM не знает, какой класс создавать.

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

  1. Из-за стирания тип T неизвестен в рантайме, поэтому создать объект нельзяправильный ответ
  2. Потому что у T может не быть конструктора без параметров, а других причин нет
  3. Можно, если T ограничен через extends Object
  4. Можно начиная с Java 17

Разбор

В рантайме T стёрт до своей границы, JVM не знает, какой класс создавать. Обходной путь: передать Supplier<T> или Class<T> и вызвать clazz.getDeclaredConstructor().newInstance(). Отсутствие конструктора без параметров тоже проблема, но не главная причина: даже с ним new T() запрещён. Граница extends Object ничего не меняет, и ни одна версия Java это не разрешила.

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

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