Programación genérica en Java

La programación genérica tiene como objetivo facilitar el desarrollo de algoritmos (o métodos en la POO) de manera tal que el tipo de datos específico manipulado por el algoritmo sea especificado al momento de ejecutar el algoritmo  y no al momento de desarrollar el algoritmo. Por ejemplo, se puede desarrollar un algoritmo que opera con números (en términos genéricos), y sólo al momento de ejecutar el algoritmo se especifica el tipo concreto de número como Integer, Float o Double[1].

Antes que la programación genérica sea incorporada como una característica del lenguaje Java, este estilo programación de algoritmos podría realizarse empleando parámetros de tipos abstractos o empleado sobrecarga de métodos, el problema con estos enfoques, sin embargo, radica principalmente en que, en tiempo de compilación, no era posible detectar el uso inapropiado de tipos que se manifestaban luego en excepciones en tiempo de ejecución y en la duplicación innecesaria de código violando el principio DRY.

La especificación genérica de tipo se emplea en la práctica totalidad de las Interfaces y clases de la librería de colecciones de Java[2].

Parámetros de Tipo (Type parameters)

Los parámetros de tipos se emplean principalmente en métodos, interfaces y clases. En el siguiente vídeo se demuestran los fundamentos del uso de parámetros de tipo:

El acotamiento de tipos, una técnica central en la programación genérica, es demostrado en el siguiente vídeo:

El carácter comodín para la covarianza genérica

A pesar de que en java Integer es un subtipo/subclase de Number el manejo genérico de tipos no es covariante en la librería de colecciones de Java; es decir, aunque Integer sea un subtipo de Number. Lista<Integer> no es un subtipo de List<Number>. Para hacer que la colecciones sean covariantes con el tipo genérico, se emplea el carácter comodín (?) tal cual se demuestra en el siguiente vídeo:

Borrado de Tipos

En Java los mecanismos de programación genérica existen solo en tiempo de compilación y la información sobre parámetros y valores de tipos es eliminada y reemplazada por tipos concretos de acuerdo a las siguientes reglas:

  • Un tipo no acotado se reemplaza con Object
  • Un tipo acotado se reemplaza con el tipo en límite superior  (el tipo más genérico)
  • Los tipos genéricos en los valores de retorno se reemplazan por conversiones explicitas (cast)

Esta forma de implementación de la programación genérica conocida como borrado de tipos (type erasure) supone algunas limitaciones a tomar en cuanta y que  están descritas en este enlace.

El siguiente vídeo muestra cómo funciona el borrado de tipos en Java:

Finalmente, Oracle ha puesto en marcha el proyecto Valhalla para incluir mejoras al lenguaje y la máquina virtual de Java incluyendo a preservación de tipos genéricos en tiempo de ejecución.

Referencias

[1] Tutorial sobre Generics

[2] Covariance and Contravariance

[3] Guidelines for Wildcard Use

 

[1]En java los tipos de datos primitivos no puede ser empleados de manera genérica.

[2]La librería de colecciones de Java será un tema a desarrollar con más detalle en otro artículo

Comments are closed.