Стирание типов и его последствия
Вопрос
Что такое стирание типов в Java, зачем его сделали и какие ограничения оно накладывает?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Параметры заменяются границей, вставляются приведения
Причина: совместимость с кодом до 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 ошибок.