Werden Generika vom Compiler zur Kompilierzeit entfernt?

8

In diesem Tutorial zur Reflektion heißt es:

  

[...] da Generika über Type-Löschung implementiert werden, die alle Informationen zu generischen Typen während der Kompilierung entfernt

Mein Wissen war, dass Generika verwendet werden, so dass der Compiler zum Zeitpunkt der Kompilierung die Typsicherheit überprüfen kann. d. h. fehlgeschlagener schneller Ansatz. Der Link erwähnt jedoch, dass das Löschen des Typs generische Informationen während der Kompilierung entfernt.

    
Victor 08.10.2013, 16:23
quelle

3 Antworten

9

Die von Ihnen angegebene Anweisung ist korrekt: Der Compiler verwendet die generischen Typinformationen intern während des Kompilierungsprozesses und generiert bei der Verarbeitung der Quellen typbezogene Fehler. Sobald die Validierung abgeschlossen ist, generiert der Compiler vom Typ gelöschter Byte-Code, wobei alle Verweise auf generische Typen durch ihren jeweiligen Typ ersetzt werden.

Diese Tatsache wird offensichtlich, wenn Sie die Typen durch Reflektion betrachten: Alle Schnittstellen, Klassen und Funktionen werden nicht-generisch, wobei alle Typen, die an generische Typparameter gebunden sind, durch einen generischen Typparameter ersetzt werden im Quellcode. Obwohl die reflection API zur Laufzeit einige Informationen zu generics * enthält, kann die virtuelle Maschine den genauen generischen Typ nicht auf Kompatibilität überprüfen, wenn Sie durch Reflexion auf Ihre Klassen zugreifen.

>

Wenn Sie beispielsweise ein Klassenmitglied vom Typ List<String> erstellen und versuchen, ein List<Integer> darauf zu setzen, wird sich der Compiler beschweren. Wenn Sie jedoch versuchen, das Gleiche durch Reflexion zu tun, wird der Compiler das nicht herausfinden, und der Code wird zur Laufzeit auf die gleiche Weise fehlschlagen wie ohne Generics:

%Vor%

Demo auf ideone.

* Siehe diese Antwort für Details zum Abrufen von Informationen zu generischen Typen zur Laufzeit.

    
dasblinkenlight 08.10.2013, 16:26
quelle
4

Einige Generics bleiben in der kompilierten Klasse - zum Beispiel einschließlich Methodensignaturen und Klassendefinitionen. Zur Laufzeit behalten keine Objekte ihren vollständigen generischen Typ, aber selbst zur Laufzeit können Sie die generische Definition einer Klasse oder Methode nachschlagen.

Zum Beispiel, wenn Sie

haben %Vor%     
Louis Wasserman 08.10.2013 16:32
quelle
1

Es bedeutet, wenn es in Bytecode konvertiert wird. Um zu überprüfen, ob korrekte Typen verwendet werden, werden Generika verwendet. Aber zum Zeitpunkt der Bytecode-Generierung werden Informationen entfernt

    
Prasad Kharkar 08.10.2013 16:26
quelle

Tags und Links