Обобщения — это средство универсального программирования , которое было добавлено к языку программирования Java в 2004 году в версии J2SE 5.0. Они были разработаны для расширения системы типов Java, чтобы позволить «типу или методу работать с объектами различных типов, обеспечивая при этом безопасность типов во время компиляции». [1] Безопасность типа аспекта времени компиляции не была полностью достигнута, поскольку в 2016 году было показано, что она не гарантируется во всех случаях. [2]
Платформа коллекций Java поддерживает универсальные шаблоны для указания типа объектов, хранящихся в экземпляре коллекции.
В 1998 году Гилад Брача , Мартин Одерски , Дэвид Стаутамир и Филип Уодлер создали Generic Java, расширение языка Java для поддержки универсальных типов. [3] Generic Java был включен в Java с добавлением подстановочных знаков.
Следующий блок кода Java иллюстрирует проблему, которая возникает, когда не используются дженерики. Во- первых, он объявляет ArrayList
тип Object
. Затем он добавляет в String
файл ArrayList
. Наконец, он пытается извлечь добавленное String
и привести его к Integer
ошибке в логике, поскольку обычно невозможно привести произвольную строку к целому числу.
Хотя код скомпилирован без ошибок, он вызывает исключение времени выполнения ( java.lang.ClassCastException
) при выполнении третьей строки кода. Этот тип логической ошибки может быть обнаружен во время компиляции с помощью шаблонов и является основной причиной их использования.
Параметр типа String
в угловых скобках объявляет ArrayList
, что состоит из String
(потомка ArrayList
общих Object
составляющих ). С дженериками больше нет необходимости приводить третью строку к какому-либо конкретному типу, потому что результат v.get(0)
определяется String
кодом, сгенерированным компилятором.