instanciar - borrado de tipos de javap y generics
instanciar clases genericas java (1)
En tiempo de compilación , en el bytecode generado, las clases, sí, conservarán toda su información de tipo genérico. Lo que has visto es exactamente lo que deberías esperar.
La diferencia es que los tipos se borran en tiempo de ejecución : por ejemplo, una instancia de la clase Ambiguity<Integer, String>
no sabrá que sus argumentos de tipo son Integer
y String
respectivamente.
Estoy leyendo a Herbert Schilds sobre el borrado de tipos en genéricos en Java. Supuestamente, ejecutar javap en una clase debería darme la información de bytecode sobre los campos y métodos públicos, protegidos y protegidos del paquete después de la borradura de tipo. Sin embargo, escribí la siguiente clase:
class Ambiguity<T, V extends String>{
T ob1;
V ob2;
void set(T o){
ob1 = o;
}
void set(V o){
ob2 = o;
}
}
y ejecutó javap en el archivo de clase que se generó y obtuvo la siguiente salida
Compilado de "Test.java"
class Ambiguity<T, V extends java.lang.String> {
T ob1;
V ob2;
Ambiguity();
void set(T);
void set(V);
}
Esperaba un resultado que se pareciera a esto basado en lo que leí.
Compiled from "Test.java"
class Ambiguity<java.lang.Object, java.lang.String> {
java.lang.Object ob1;
java.lang.String ob2;
Ambiguity();
void set(java.lang.Object);
void set(java.lang.String);
}
¿Me estoy perdiendo de algo? Debo agregar que entiendo que no es una buena práctica sobrecargar los métodos de la manera anterior. Solo estaba viendo interesados en ver los resultados de javap bajo esta ambigüedad.
EDITAR: Esto parece ser el resultado de una nueva corrección en javap. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651
Si ejecuto javap desde JDK 1.6 obtengo los resultados como esperaba. Si ejecuto javap desde JDK 1.7 b30, que era lo que estaba usando inicialmente, obtengo el resultado con la información genérica.