2013-04-09 18 views
7

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.

risposta

3

A tempo di compilazione - nel codice byte generato - le classi, sì, conserveranno tutte le informazioni di tipo generico. Quello che hai visto è esattamente ciò che dovresti aspettarti.

La differenza è che tipi sono cancellati al runtime: per esempio, un esempio della classe Ambiguity<Integer, String> non sa che i suoi argomenti tipo sono Integer e String rispettivamente.

+0

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. –

+0

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. –

+0

Un'altra domanda su SO, dice anche la stessa cosa: http://stackoverflow.com/questions/11966091/displaying-generic-type-parameters-from-compiled-class-files –