Вопрос с собеседования · Java

Что невозможно из-за стирания типов?

MiddleДженерики
Коротко

В рантайме параметра типа нет, поэтому нельзя: new T(), new T[n], instanceof List<String>, статическое поле типа T, перегрузка m(List<String>) и m(List<Integer>) (одинаковая стёртая сигнатура), catch (T e).

  • Причина — совместимость с кодом до Java 5
  • Компилятор вставляет приведения, в байт-коде Object или верхняя граница
  • Обход — передать Class<T>, Supplier<T>, TypeReference (Jackson)

А ещё Тип сохраняется в сигнатурах классов и полей — его читают через рефлексию

Подробно

Стирание было платой за совместимость с кодом, написанным до появления дженериков: компилятор проверяет типы и вставляет приведения, а в байткоде остаётся обычный Object или верхняя граница. Отсюда весь список ограничений, включая невозможность создать массив параметризованного типа и запрет на обобщённые классы исключений — блок catch работает в рантайме и не смог бы различить типы. Статическое поле невозможно потому, что оно принадлежит классу, общему для всех параметризаций. Обходной приём, который стоит назвать: передавать Class<T> в конструктор и создавать объекты рефлексией, либо принимать фабрику Supplier<T>. Использование T в сигнатурах методов, разумеется, работает — на этом дженерики и построены.

Что хотят услышать

  • Перечень ограничений.
  • Причина стирания.
  • Обходные пути.

Частые ошибки

  • Пытаться сделать обобщённый класс исключения.
  • Забывать, что информация о параметре в полях и сигнатурах всё же сохраняется в метаданных и доступна рефлексии.

Проверьте себя

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Создать экземпляр параметра типа: new T()
  • ✓Проверить obj instanceof List<String>
  • ✓Объявить статическое поле типа параметра T в обобщённом классе
  • ✗Использовать параметр типа в качестве типа возвращаемого значения метода

Что спросят дальше

  • Как обойти невозможность new T()?
  • Почему нельзя создать массив List<String>[]?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования