Выбор ответа Senior Дженерики и стирание обновлено
Тип параметра в рантайме
Вопрос
Как Jackson в new TypeReference<List<User>>() {} узнаёт тип List<User>, если дженерики стираются?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Из сигнатуры анонимного подкласса: её достают через getGenericSuperclass(). Стираются типы значений и вызовов, но не объявления: сигнатуры классов, полей и методов хранятся в атрибуте Signature.
Варианты ответа
- Из сигнатуры анонимного подкласса: её достают через
getGenericSuperclass()правильный ответ - Из объекта списка: каждый элемент в рантайме хранит параметр типа
User - Компилятор Jackson генерирует отдельный класс-десериализатор на каждый тип
- Никак: Jackson всегда читает элементы как
Map, аUserподставляет при доступе
Разбор
Стираются типы значений и вызовов, но не объявления: сигнатуры классов, полей и методов хранятся в атрибуте Signature. Анонимный класс extends TypeReference<List<User>> записывает полный параметризованный суперкласс, его достают через getClass().getGenericSuperclass(). Объекты в рантайме параметр не хранят. Своего компилятора у Jackson нет. Без TypeReference Jackson действительно прочитал бы элементы как LinkedHashMap, но с ним тип известен.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.