2013-04-09 10 views
7

Ich lese Herbert Schilds über Typ löschen in Generika in Java. Angenommen, javap in einer Klasse auszuführen, sollte ich die Bytecode-Informationen über öffentliche, paketgeschützte und geschützte Felder und Methoden nach dem Typ löschen. Allerdings schrieb ich die folgende Klasse:javap und generics type löschen

class Ambiguity<T, V extends String>{ 
    T ob1; 
    V ob2; 

    void set(T o){ 
     ob1 = o; 
    } 

    void set(V o){ 
     ob2 = o; 
    } 
} 

und lief javap auf der Klassendatei, die erzeugt wurde, und bekam die folgende Ausgabe

Zusammengestellt von „Test.java“

class Ambiguity<T, V extends java.lang.String> { 
    T ob1; 
    V ob2; 
    Ambiguity(); 
    void set(T); 
    void set(V); 
} 

Ich war Ich erwartete eine Ausgabe, die basierend auf dem, was ich gelesen habe, aussah.

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); 
} 

Fehle ich hier etwas? Ich sollte hinzufügen, dass ich verstehe, dass es keine gute Methode ist, Methoden in der oben genannten Weise zu überladen. Ich sah gerade Interesse daran, die Ergebnisse von javap unter dieser Mehrdeutigkeit zu sehen.

EDIT: Dies scheint ein Ergebnis einer neuen Fix in Java zu sein. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4870651

Wenn ich javap von JDK 1.6 ausführen, bekomme ich die Ergebnisse, wie ich erwartet hatte. Wenn ich javap von JDK 1.7 b30 starte, was ich ursprünglich verwendet habe, bekomme ich das Ergebnis mit den generischen Informationen.

Antwort

3

Bei Kompilierzeit - in den generierten Bytecode - Klassen behalten, ja, alle ihre generischen Typ Informationen. Was Sie gesehen haben, ist genau das, was Sie erwarten sollten.

Der Unterschied ist, dass die Typen bei Laufzeit gelöscht werden: zum Beispiel eine Instanz der Klasse Ambiguity<Integer, String> wird nicht wissen, dass seine Art Argumente sind Integer und String sind.

+0

Danke für die Antwort. Hier ist, was Schilds sagt, "Wenn Ihr Java-Code kompiliert wird, werden alle generischen Typinformationen entfernt (gelöscht)". Er zeigt die Ergebnisse des Laufens von Javap wie der letzte oben. –

+0

Dann ist Schilds falsch. Typenlöschung ist ein Laufzeitphänomen, und es gibt viele Dienstprogramme, die die Tatsache ausnutzen, dass Klassen ihre generischen Typinformationen behalten; Es sind nur _instances_, die diese Metadaten verlieren. –

+0

Eine andere Frage zu SO, sagt auch dasselbe: http://stackoverflow.com/questions/11966091/displaying-generic-type-parameters-from-compiled-class-files –