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.
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?
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.
Tags und Links java generics type-erasure