Ответ вслух Middle Дженерики и стирание спрашивают часто обновлено

Стирание типов и его последствия

Вопрос

Что такое стирание типов в Java, зачем его сделали и какие ограничения оно накладывает?

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

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

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

Коротко

Дженерики в Java проверяются только компилятором. После проверки параметры стираются: T превращается в свою границу, обычно Object, а в местах чтения вставляются приведения.

Что должно прозвучать в ответе

  • Параметры заменяются границей, вставляются приведения

  • Причина: совместимость с кодом до Java 5

  • Нельзя new T(), new T[], instanceof List<String>

  • Нельзя перегрузить методы с одинаковым стиранием

  • Объявления сохраняют сигнатуры: type token, TypeReference

  • Сырые типы и heap pollution

Что могут спросить следом

  • Что такое bridge-метод?
  • Как в Kotlin обходят стирание через reified?

Разбор

Дженерики в Java проверяются только компилятором. После проверки параметры стираются: T превращается в свою границу, обычно Object, а в местах чтения вставляются приведения. Так сделали в Java 5, чтобы новый код работал со старыми библиотеками и JVM без изменений. Последствия: нельзя создать new T() или массив T[], нельзя проверить instanceof List<String>, нельзя перегрузить f(List<String>) и f(List<Integer>), статическое поле не может иметь тип T. Когда тип нужен в рантайме, передаю Class<T> или пользуюсь тем, что сигнатуры объявлений в байткоде сохраняются: на этом построен TypeReference в Jackson. Ещё одна ловушка: сырые типы позволяют положить в List<String> число, и ClassCastException вылетит далеко от места ошибки.

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

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