Sto leggendo Herbert Schilds sulla cancellazione dei caratteri nei generici in Java. Apparentemente javap in esecuzione su una classe dovrebbe darmi le informazioni bytecode su pubbliche, pacchetti protetti e protetti campi e metodi dopo la cancellazione di tipo. Tuttavia, ho scritto la seguente classe:javap e generics 'type erasure
class Ambiguity<T, V extends String>{
T ob1;
V ob2;
void set(T o){
ob1 = o;
}
void set(V o){
ob2 = o;
}
}
e corsi javap sul file di classe che è stato generato e ha ottenuto il seguente output
compilato da "Test.java"
class Ambiguity<T, V extends java.lang.String> {
T ob1;
V ob2;
Ambiguity();
void set(T);
void set(V);
}
ero mi aspettavo un risultato simile a quello che ho letto.
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);
}
Mi manca qualcosa qui? Devo aggiungere che capisco che non è una buona pratica sovraccaricare i metodi nel modo sopra descritto. Stavo solo vedendo interessato a vedere i risultati di javap sotto questa ambiguità.
MODIFICA: Questo sembra essere il risultato di una nuova correzione in javap. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651
Se eseguo javap da JDK 1.6 ottengo i risultati come mi aspettavo. Se eseguo javap da JDK 1.7 b30 che era quello che stavo usando inizialmente, ottengo il risultato con le informazioni generiche.
Grazie per la risposta. Ecco cosa dice Schilds: "Quando il tuo codice Java è compilato, tutte le informazioni di tipo generico vengono rimosse (cancellate)". Mostra i risultati dell'esecuzione di javap come l'ultimo sopra. –
Quindi Schilds ha torto. La cancellazione dei caratteri è un fenomeno runtime e ci sono molte utility che sfruttano il fatto che le classi mantengono le loro informazioni di tipo generico; sono solo _istanze_ che perdono quei metadati. –
Un'altra domanda su SO, dice anche la stessa cosa: http://stackoverflow.com/questions/11966091/displaying-generic-type-parameters-from-compiled-class-files –