Java Generics es una de las características más importantes del lenguaje Java. La idea detrás de los genéricos es bastante simple, sin embargo, a veces resulta compleja debido al cambio de la sintaxis habitual asociada con ella.
el propósito de este tutorial es presentarle este útil concepto de genéricos de una manera fácil de entender.
pero antes de sumergirnos en los genéricos en sí, averigüemos por qué se necesitaban los genéricos de Java en primer lugar.,
propósito de Java Generics
antes de la introducción de generics en Java 5, podía escribir y compilar un fragmento de código como este sin lanzar un error o una advertencia:
podía agregar valores de cualquier tipo a una lista u otra colección de Java sin tener que declarar qué tipo de datos almacena. Pero cuando recuperas valores de la lista, tienes que convertirlo explícitamente a un tipo determinado.
considere iterar a través de la lista anterior.,
permitir la creación de una lista sin declarar primero el tipo de datos almacenados, como hicimos, podría resultar en que los programadores cometieran errores como el anterior que arroja ClassCastExceptions
durante el tiempo de ejecución.
Los genéricos se introdujeron para evitar que los programadores cometieran tales errores.
Con genéricos, puede declarar explícitamente el tipo de datos que se va a almacenar al crear una colección Java como se muestra en el siguiente ejemplo.,
ahora, no puede almacenar por error un entero en una lista de tipos de cadena sin lanzar un error en tiempo de compilación. Esto asegura que su programa no se ejecute en errores de tiempo de ejecución.
el propósito principal de la introducción de genéricos a Java era evitar encontrarse con ClassCastExceptions
durante el tiempo de ejecución.
crear genéricos de Java
puede usar genéricos para crear clases y métodos Java., Veamos los ejemplos de cómo crear genéricos de cada tipo.
clase genérica
al crear una clase genérica, el parámetro de Tipo para la clase se agrega al final del nombre de la clase dentro de los corchetes angle <>
.
Aquí T
es el tipo de datos del parámetro. T
, N
, and E
are some of the letters used for data type parameters according to Java conventions.,
en el ejemplo anterior, puede pasarle un tipo de datos específico al crear un objeto GenericClass.
no puede pasar un tipo de datos primitivo al parámetro Tipo de datos al crear un objeto de clase genérico. Solo los tipos de datos que amplían el tipo de objeto se pueden pasar como parámetros de tipo.
Por ejemplo:
Métodos Genéricos
la Creación de métodos genéricos sigue un patrón similar a la creación de clases genéricas. Puede implementar un método genérico dentro de una clase genérica, así como uno no Genérico.,
Aquí, puede pasar una matriz de un tipo específico para parametrizar el método. El método genérico PrintItems()
itera a través de la matriz pasada e imprime los elementos almacenados como un método Java normal.
Bounded Type Parameters
hasta ahora, las clases y métodos genéricos que hemos creado anteriormente se pueden parametrizar a cualquier tipo de datos que no sean tipos primitivos. Pero, ¿y si quisiéramos limitar los tipos de datos que se pueden pasar a genéricos? Aquí es donde entran los parámetros de tipo acotado.,
Puede enlazar los tipos de datos aceptados por una clase o método genérico especificando que debe ser una subclase de otro tipo de datos.
por ejemplo:
Aquí, el UpperBoundedClass
y UpperBoundedMethod
solo se pueden parametrizar utilizando subtipos del tipo de datos List
.
List
el tipo de datos actúa como un límite superior al parámetro type. Si intenta usar un tipo de datos que no es un subtipo de List
, lanzará un error en tiempo de compilación.
los límites no están limitados a solo clases., También puede pasar interfaces. Extender la interfaz significa, en este caso, implementar la interfaz.
un parámetro también puede tener múltiples límites como se muestra en este ejemplo.
el tipo de datos que acepta debe ser una subclase de las clases Animal y mamífero. Si uno de estos límites es una clase, debe aparecer primero en la declaración vinculante.
en el ejemplo anterior, si Mammal es una clase y Animal es una interfaz, Mammal debe venir primero como se muestra arriba. De lo contrario, el código genera un error en tiempo de compilación.,
comodines genéricos de Java
Los comodines se utilizan para pasar parámetros de tipos genéricos a los métodos. A diferencia de un método genérico, aquí, el parámetro genérico se pasa a los parámetros aceptados por el método, que es diferente del parámetro de tipo de datos que discutimos anteriormente. Un comodín está representado por el ? simbolo.
arriba printItems()
método acepta listas de cualquier tipo de datos del parámetro. Esto evita que los programadores tengan que repetir códigos para listas de diferentes tipos de datos, lo que sería el caso sin genéricos.,
comodines acotados superiores
si queremos limitar los tipos de datos almacenados en la lista aceptada por el método, podemos utilizar comodines acotados.
ejemplo:
printSubTypes()
el método acepta solo las listas que almacenan subtipos de Color. Acepta una lista de objetos RedColor o BlueColor, pero no acepta una lista de objetos animales. Esto se debe a que el Animal no es un subtipo de Color. Este es un ejemplo de un comodín con límite superior.,
comodines con límites inferiores
del mismo modo, si tuviéramos:
entonces, el métodoprintSuperTypes()
solo acepta listas que almacenan supertipos de la clase Dog. Aceptaría una lista de objetos de mamíferos o animales, pero no una lista de objetos de LabDog porque LabDog no es una superclase de perro, sino una subclase. Este es un ejemplo de un comodín de límite inferior.
conclusión
Java Generics se ha convertido en una característica sin la que los programadores no pueden vivir desde su introducción.
esta popularidad se debe a su impacto en facilitar la vida de los programadores., Aparte de evitar que cometan errores de codificación, el uso de genéricos hace que el código sea menos repetitivo. ¿Notaste cómo generaliza clases y métodos para evitar tener que repetir código para diferentes tipos de datos?
tener una buena comprensión de los genéricos es importante para convertirse en un experto en el idioma. Por lo tanto, aplicar lo que aprendiste en este tutorial en código práctico es la manera de avanzar ahora.