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
Comentarios
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)
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!