Buscar
Social
Ofertas laborales ES
« JUDE, entorno de desarrollo Java+UML | Main | JCite, citar código Java en documentos HTML »
martes
nov072006

Información sobre tipos genéricos en tiempo de ejecución

La gran carencia de generics en java es la imposibilidad de obtener información acerca del tipo de una clase genérica; por ejemplo, en tiempo de ejecución yo no puedo saber si un objeto de tipo List es un List <String > o un List<Float>. El motivo es que en java, a diferencia de C++, los tipos genéricos no son más que un edulcorante sintáctico que evita hacer unos cuantos cast y que permite al compilador realizar ciertos chequeos estáticamente. Sin embargo, toda la información acerca del tipo genérico es eliminada al crear el bytecode, de tal forma que un List para la máquina virtual siempre contiene Objects.



En su día se tomó esta decisión para hacer compatible el bytecode de Java 5 con las versiones anteriores, así como para no necesitar añadir una nueva versión de muchas librerías estándar (en especial el framework de colecciones) a la distribución del entorno base de la plataforma donde las clases fueran genéricas. C# en su versión 2.0 optó o por este segundo camino (tener una librería genérica y otra no genérica). Pero en su caso tenía una base de código muy pequeña y las molestias para los usuarios finales no iban a ser excesivas.



Ahora Neal Gafter, ex empleado de Sun, empleado de Google y una de las personas que ha jugado un papel más importante en el diseño de Java 5, reflexiona en su weblog sobre cómo se podría añadir información acerca de los tipos en la plataforma. Propone dos caminos diferentes. Uno, usar anotaciones, lo cual impediría que el código genérico fuese empleado por código no genérico. Este camino no requiere una modificación al lenguaje.



La otra alternativa es modificar el lenguaje incluyendo una nueva sintaxis para definir tipos genéricos cuya información se mantendrá en tiempo de ejecución. El cambio consistiría en escribir <class T> en vez de <T>. El código que usase los tipos generics podría ser código genérico o no genérico. El que usase los nuevos generics tendría que ser código genérico. Esta alternativa requeriría construir una nueva implementación de todo el framework de colecciones.



Cualquiera de los dos cambios requeriría modificaciones muy profundas en la máquina virtual, compiladores y librerías.



¿Crees que merece la pena aplicar una de estas dos propuestas para obtener información en tiempo de ejecución sobre los tipos genéricos? ¿Alguna vez has necesitado hacer esto?

Reader Comments

There are no comments for this journal entry. To create a new comment, use the form below.
Comentarios deshabilitados
Comentarios deshabilitados en esta noticia.