Java-Typ löschen vs. Feld # getGenericType und Methode # getGenericReturnType

8

Wie ich sie verstehe, sind Generika eine Kompilierzeitfunktion von Java, und im kompilierten Bytecode gibt es keine parametrisierten Typinformationen. Ich habe nun die Methoden getGenericType und getGenericReturnType entdeckt und damit meine Weltansicht zerstört. Bitte helfen Sie mir, es zusammenzufügen.

    
Landon Kuhn 28.05.2009, 23:05
quelle

3 Antworten

6

Die gerade Laufzeittypen von Objekten werden gelöscht. Zum Beispiel:

%Vor%

obj.getClass() gibt ArrayList.class zurück. Sie können sogar sagen, dass ArrayList einen generischen Parameter hat. Aber es gibt keine Möglichkeit festzustellen, ob obj als ArrayList<String> , ArrayList<Integer> , ArrayList<Object> , ArrayList (roh) oder irgendetwas anderes erstellt wurde.

Statische Informationen sind immer noch für Klassen, Methoden usw. vorhanden (allerdings nicht für Einheimische). Dies ist nur ein zusätzliches Datenelement, das als Attribute in der Klassendatei angehängt und zur Laufzeit verfügbar ist. Stellen Sie sich das ähnlich wie Annotationen mit Laufzeitbeibehaltung vor. Gab es eine Frage?

    
Tom Hawtin - tackline 28.05.2009 23:23
quelle
3

Wenn Sie in Ihrer IDE mit einem Jar kompilierter Bytecodes arbeiten, können Sie trotzdem eine generische automatische Vervollständigung erhalten. So ist es implementiert. Grundsätzlich haben Sie Recht: Typen werden nicht vollständig gelöscht.

    
cletus 28.05.2009 23:09
quelle
2

Statische generische Typinformationen für Felder und Methoden müssen in der kompilierten Klassendatei vorhanden sein, damit der Compiler beim Kompilieren anderer Quellcodes eine Typprüfung durchführen kann. Wenn Sie beispielsweise Code schreiben, der eine Variable vom Typ ArrayList<E> verwendet, und eine get() -Methode dafür aufrufen, steht Ihnen der Quellcode für die Klasse ArrayList nicht zur Verfügung. Der Compiler sucht nach der kompilierten Klassendatei und erhält den generischen Rückgabetyp der get() -Methode und stellt fest, dass er den generischen Typ E zurückgibt, so dass er die Typprüfung durchführen kann. Daher müssen die generischen Typinformationen vorhanden sein, damit der Compiler sie überprüfen kann.

    
newacct 28.05.2009 23:59
quelle

Tags und Links