Что невозможно из-за стирания типов?
В рантайме параметра типа нет, поэтому нельзя: 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>[]?
Разбор темы
- Дженерики и стирание типов
Типобезопасность на компиляции, механизм type erasure и его последствия, дженерик-методы, ограниченные параметры и опасность raw types.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.