Ingresar:

Eliminado :: Blog :: Acerca de Generics y Reflection en Java

March 12, 2008

Bueno me estaba guardando esto para cuando tenga tiempo de escribir mas a detalle, pero como Wilfredo ya escribió acerca de Reflection, pues ahí va.

Hay un problemilla con Reflection y Generics en Java. Resulta que en Java, la implementación de generics se la hizo en base a un proyecto llamado Pizza, uno de cuyos objetivos era el de poder implementar generics sin cambios a la VM. Esto trajo dos problemitas segun Anders Heljsberg, uno de ellos es el que mas nos importa desde el punto de vista de la reflección:

"because Java's generics implementation relies on erasure of the type parameter, when you get to runtime, you don't actually have a faithful representation of what you had at compile time. When you apply reflection to a generic List in Java, you can't tell what the List is a List of. It's just a List. Because you've lost the type information, any type of dynamic code-generation scenario, or reflection-based scenario, simply doesn't work. If there's one trend that's pretty clear to me, it's that there's more and more of that. And it just doesn't work, because you've lost the type information."

Bueno, esta claro no?, es decir que en Java la reflección se implementó como un pequeño parche para no afectar a la VM (o eso me parece al menos). En material de Sun:

"Generics are implemented by type erasure: generic type information is present only at compile time, after which it is erased by the compiler. The main advantage of this approach is that it provides total interoperability between generic code and legacy code that uses non-parameterized types (which are technically known as raw
types). The main disadvantages are that parameter type information is not available at run time, and that automatically generated casts may fail when interoperating with ill-behaved legacy code. There is, however, a way to achieve guaranteed run-time type safety for generic collections even when interoperating with ill-behaved legacy code."

Fuentes:

http://www.artima.com/intv/generics2.html

http://java.sun.com/j2se/1.5.0/docs/guide/language/generics

Palabras clave: Anders Heljsberg, Java, Reflection

Enviado por Eliminado



Comentarios

  1. Alguna vez trabajando con reflection y Generics

    utilice el método getTypeParameter() de la clase Class, el cual nos permite recuperar los parámetros genéricos de una clase, por ejemplo

     class Miclase<Persona> {...}

    haciendo reflection

    TypeVariable[] genericsVars= Miclase.class.getTypeParamter(); 

    El problema se daba cuando definía algo como

     class MiClase2<T> {...}

    Creo que al usar tipos que no existen como el caso de "T", estos son borrados  al momento de compilación y se los deja en Object (si mal no recuerdo)

     

    user iconAdrián Grajeda on Wednesday, 12 March 2008, 17:25 BOT # |

  2. Sip, está claro Alvaro. Java SE 5 y 6 sufren de ese problema, el cual es algo complicado de lidiar, pero se puede.

    Pero en Java 7 la cosa cambiará hermosamente.

    Si quieres ver la lista completa de nuevas mejoras las puedes ver en la misma página. Algunas son realmente preciosas.

    Looking forward for them! 

     

    user iconFer © on Wednesday, 12 March 2008, 19:14 BOT # |

Debes iniciar sesión para enviar un comentario.