Стирание типов (Type Erasure) в Java существует для обеспечения обратной совместимости с более ранними версиями Java, которые не имели дженериков.
При компиляции Java-кода с дженериками, компилятор автоматически удаляет всю информацию о параметрах типа (например, <String> или <Integer>) из байт-кода. Вместо этого, все экземпляры дженерик-типов заменяются на их верхнюю границу (обычно Object), а при необходимости вставляются явные приведения типов.
Это позволяет коду, использующему дженерики, взаимодействовать с библиотеками и классами, скомпилированными без поддержки дженериков, без изменения их байт-кода.
Основные последствия стирания типов:
.getClass().getGenericSuperclass() или подобных методов для получения конкретных параметров типа не сработает для обычных экземпляров.new ArrayList<String>[10] вызовет ошибку компиляции.instanceof: object instanceof List<String> выдаст ошибку компиляции. Можно использовать object instanceof List.Пример стирания типов:
java
Таким образом, стирание типов является компромиссом между добавлением мощной возможности (дженериков) и сохранением обратной совместимости с существующей кодовой базой.