83.    Genéricos [generics] (concepto)

Bajo la expresión “soporte de genéricos” java proporciona dos facilidades de programación bastante diferentes:

·         tipos genéricos; que son clases parametrizadas por uno o más tipos que deben ser facilitados por el programador cuando quiera usar la clase creando objetos

·         métodos genéricos, que son métodos en los que los argumentos y/o el resultado incluyen referencias a tipos que no se conocerán hasta que vayamos a usar el método

Probablemente el principal motivo para el uso de genéricos en java sea la necesidad de disponer de colecciones homogéneas de objetos (listas, conjuntos, etc. facilitados en el paquete java.util). Así el ejemplo más habitual del uso de genéricos es la clase lista genérica, definida como

public interface List<E>

public class ArrayList<E> implements List<E>

 

donde E queda a definir. Se dice que E es un tipo formal.

En inglés se suele emplear la expresión “type parameter” para referirse a esos parámetros formales que no se refieren a valores, sino a tipos de valores. En la traducción al español, “parámetros de tipo” suena muy extraño, por lo que emplearemos la forma más técnica “tipo formal” indicando que cuando se vaya a utilizar la clase hay que proporcionar un “tipo real”.

Con esta clase genérica podemos crear objetos de diferentes tipos

·         new ArrayList<String>   es una lista de String

·         new ArrayList<Integer>  es una lista de Integer

·         new ArrayList<Punto>    es una lista de objetos de clase Punto

donde todos ellos se caracterizan por crear listas homogéneas (todos los elementos son del mismo tipo), resultando programas limpios y, probablemente, con menos errores.

El objetivo de los genéricos con java es

·         desplazar a tiempo de compilación los tradicionales errores de ejecución que ocurrían en programas con fuerte uso de downcasting

·         si el compilador no se queja, se puede asegurar que no habrá errores de tipo de datos (casting) en ejecución

“Quejarse” quiere decir que el compilador protesta como se puede ver en el siguiente ejemplo, al compilar la clase Queue_Array que se usa un poco más adelante:

$ javac Queue_Array.java

Note: Queue_Array.java uses unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

 

jam@toshiba-a10 /c/home/doc/PET/exs/genericos

$ javac -Xlint:unchecked Queue_Array.java

Queue_Array.java:23: warning: [unchecked] unchecked cast

found   : java.lang.Object

required: T

        T x = (T) data[0];

                      ^

1 warning    

 

Temas relacionados

Vademécum
clases genéricas en el package java.util
creación de clases genéricas
limitaciones de las clases genéricas en java
métodos genéricos
tipos formales acotados