Los genéricos son una función de programación genérica que se agregaron al lenguaje de programación Java en 2004 dentro de la versión J2SE 5.0. Fueron diseñados para extender el sistema de tipos de Java para permitir que "un tipo o método opere en objetos de varios tipos mientras proporciona seguridad de tipos en tiempo de compilación". [1] El aspecto seguridad de tipo en tiempo de compilación no se logró en su totalidad, ya que se demostró en 2016 que no está garantizado en todos los casos. [2]
El marco de trabajo de colecciones de Java admite genéricos para especificar el tipo de objetos almacenados en una instancia de colección.
En 1998, Gilad Bracha , Martin Odersky , David Stoutamire y Philip Wadler crearon Generic Java, una extensión del lenguaje Java para admitir tipos genéricos. [3] Java genérico se incorporó en Java con la adición de comodines.
El siguiente bloque de código Java ilustra un problema que existe cuando no se utilizan genéricos. Primero, declara un ArrayList
tipo de Object
. Luego, agrega un String
al ArrayList
. Finalmente, intenta recuperar el agregado String
y convertirlo en un Integer
—un error de lógica, ya que generalmente no es posible convertir una cadena arbitraria a un entero.
Aunque el código se compila sin errores, arroja una excepción de tiempo de ejecución ( java.lang.ClassCastException
) al ejecutar la tercera línea de código. Este tipo de error lógico se puede detectar durante el tiempo de compilación mediante el uso de genéricos y es la principal motivación para usarlos.
El parámetro de tipo String
dentro de los corchetes angulares declara ArrayList
que está constituido por String
(un descendiente de los constituyentes ArrayList
genéricos de ' Object
). Con genéricos, ya no es necesario convertir la tercera línea a ningún tipo en particular, porque el resultado de v.get(0)
está definido String
por el código generado por el compilador.