Существует только один класс ArrayList
, но он поддерживает дженерики, что означает, что вы можете аннотировать его типом. Однако это необязательно (в основном для обратной совместимости), поэтому вы также можете продолжать использовать необработанный тип (но это не рекомендуется).
Обратите внимание, что универсальные шаблоны Java имеют место только для компилятора, во время выполнения сам экземпляр ArrayList не знает, какой универсальный тип вы ему присвоили. Это означает, что он работает точно так же, если вы аннотируете его или нет.
В отличие от массивов, нет новых отдельных классов для универсальных коллекций. Таким образом, хотя класс Integer[]
отличается от String[]
(или Integer[][]
), класс для ArrayList<String>
такой же, как для ArrayList<Integer>
(и ArrayList<?>
, ArrayList
и ArrayList<List<Integer>>
).
И, в отличие от массивов, в дженериках нет ничего особенного для использования коллекциями (хотя это остается их самым популярным приложением). Один и тот же механизм может использоваться для совершенно разных вещей, например, Callable.