Компилятор удаляет из байткода класс-файла информацию о типах-дженериках. Этот процесс и называется
стирание типов (type erasure). Он появился в Java 5 вместе с самими дженериками. Такое решение позволило сохранить обратную совместимость без перекомпилляции кода Java 4.
Стирание состоит из трех действий:
- Если параметры ограничены (bounded), вместо типа-параметра в местах использования подставляется верхняя граница, иначе
Object; - В местах присвоения значения типа-параметра в переменную обычного типа добавляется каст к этому типу;
- Генерируются bridge-методы.
Подробнее о границах дженериков и bridge-методах поговорим в следующих постах.
Информация о типах стирается только из методов и полей, но остается в метаинформации самого класса. Получить эту информацию в рантайме можно с помощью рефлекшна, методом
Field#getGenericType.
Тип со стертой информацией о дженериках называется «Non-reifiable».
Стирание типов позволяет не создавать при применении дженериков новые классы, в отличие от, например, шаблонов C++.