Выбор ответа Senior Дженерики и стирание обновлено

Тип параметра в рантайме

Вопрос

Как Jackson в new TypeReference<List<User>>() {} узнаёт тип List<User>, если дженерики стираются?

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Из сигнатуры анонимного подкласса: её достают через getGenericSuperclass(). Стираются типы значений и вызовов, но не объявления: сигнатуры классов, полей и методов хранятся в атрибуте Signature.

Варианты ответа

  1. Из сигнатуры анонимного подкласса: её достают через getGenericSuperclass()правильный ответ
  2. Из объекта списка: каждый элемент в рантайме хранит параметр типа User
  3. Компилятор Jackson генерирует отдельный класс-десериализатор на каждый тип
  4. Никак: Jackson всегда читает элементы как Map, а User подставляет при доступе

Разбор

Стираются типы значений и вызовов, но не объявления: сигнатуры классов, полей и методов хранятся в атрибуте Signature. Анонимный класс extends TypeReference<List<User>> записывает полный параметризованный суперкласс, его достают через getClass().getGenericSuperclass(). Объекты в рантайме параметр не хранят. Своего компилятора у Jackson нет. Без TypeReference Jackson действительно прочитал бы элементы как LinkedHashMap, но с ним тип известен.

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

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