Java para programadores – Genéricos

Estamos acostumbrados a conocer el  tipo de dato que nos llega. Cuando programamos una clase, y definimos métodos establecemos los tipos de datos (integers, string, …) que nos va a llegar, pero esto que parece tan sencillo y claro, puede sernos insuficiente a veces. Para esos casos existen las formas genéricas de definición.

Utilidad de los genéricos

Supongamos que tenemos que escribir una clase que nos guarde dos objetos, y que nos permita intercambiar sus posiciones; el código podría ser algo así:

Java.Clases genericas

Hasta aquí, todo bien. Esta clase cumple son su objetivo, ….siempre que  lo que queramos guardar sean Strings, pero y si son números, o son algún tipo de clase que hemos creado nosotros?

Naturalmente que la opción, seria pasarlo todo a “object”, aunque entonces tendríamos el problema que colaría todo, que si nos equivocamos en la asignación de tipos, nadie nos avisará.

Otra opción seria crear tantas clases como tipos queramos tratar,  y seria bastante lógico hacer, cuando el tratamiento dependiera del tipo; cosa que en este ejemplo no pasa.

Entonces, la única solucion que nos queda es modificar la clase para que trabaje con tipos genéricos; la modificación seria así:

Java trabajando con genéricos

Lo que se hace, es indicar al principio, al lado den nombre de la clase, que vamos a recibir un parámetro de tipo (linea 3 <T>. Luego podemos utilizar esa letra (T) en todos los lugares en donde definiríamos tipo de argumento, por ejemplo las lineas 4 y 5 definen dos variables tipo String, si nos pasan String, o dos variables tipo Integer, si nos pasan Integer.

Podemos verlo funcionando en el siguiente ejemplo:

Java, trabajando con genericos

En la linea 6 creo un objeto Intercambio, pasando como tipo de argumento “String”, y en la linea 7, hago lo mismo, pero pasandole como tipo de argumento “Integer”. Debéis tener en cuenta, que solo puedo pasar tipos que no sean primitivos.

A partir de ese momento, ya puedo trabajar como si hubiera definido la clase específicamente para ese tipo; no necesito hacer ningún cast, cosa que necesitaría hacer si hubiera definido la clase con tipos Object

Genéricos y extends

Las cosas no son siempre tan fáciles. Habrá ocasiones en donde no podremos dotar a nuestras clases de tanta flexibilidad.

Supongamos que en nuestra clase, necesitamos hacer una comparación, o una operación aritmética…eso hace que necesitemos limitar la capacidad para recibir cualquier argumento.

Afortunadamente, eso es fácil de hacer, ya que podemos especificar la palabra “extends” para indicar que solo aceptamos argumentos que hereden de determinadas clases, o implementen determinadas interfaces; por ejemplo, si el nuevo objeto tiene que ser capaz de comparar los dos operando, podríamos exigir que solo nos pasaran tipos que implementaran la interfaz Comparable:

Genericos en Java. Extends

Acerca de Miguel Garcia

Programador, Desarrollador web, Formador en distintas areas de informatica y director de equipos multidisciplinares.
Esta entrada fue publicada en Formacion, Java y etiquetada , . Guarda el enlace permanente.

Deja un comentario