Java обрабатывает обобщения с помощью стирания типов (type erasure).
При компиляции информация об обобщенных типах удаляется. Это означает, что в байт-коде класс ArrayList<String> и ArrayList<Integer> будут выглядеть одинаково - как ArrayList. Вместо обобщенных параметров компилятор подставляет Object или верхнюю границу ограниченного типа. В местах использования типов компилятор вставляет неявные приведения типов (casts).
Преимущества стирания типов:
Недостатки стирания типов:
ArrayList<int> недопустимо. Приходится использовать их обертки (ArrayList<Integer>).new T[size]) или проверка соответствия типу (instanceof).Пример неявного приведения типа после стирания:
java
Ограниченные обобщения (Bounded wildcards) используются для более гибкого управления типами параметров.
<? extends T>: Обозначает любой тип, который расширяет или является T. Позволяет читать элементы как T или его подтипы.<? super T>: Обозначает любой тип, который ограничивается T или его супертипом. Позволяет добавлять элементы типа T или его подтипов.java