2009-05-28 5 views

Antwort

3

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

6

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

Object obj = new ArrayList<String>(); 

obj.getClass() wird ArrayList.class zurück. Sie können sogar sagen, dass ArrayList einen generischen Parameter hat. Aber es gibt keine Möglichkeit zu sagen, 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?

2

Statische generische Typinformationen für Felder und Methoden müssen in der kompilierten Klassendatei vorhanden sein, damit der Compiler beim Kompilieren anderer Quellcodes die Typüberprüfung durchführen kann. Wenn Sie beispielsweise Code schreiben, der eine Variable vom Typ ArrayList<E> verwendet, und eine get()-Methode aufrufen, verfügen Sie nicht über den Quellcode für die Klasse ArrayList. Der Compiler geht und betrachtet die kompilierte Klassendatei und ruft den generischen Rückgabetyp der get()-Methode ab, und erkennt, dass es den generischen Typ E zurückgibt, so dass es Typprüfung durchführen kann. Daher müssen die generischen Typinformationen vorhanden sein, damit der Compiler sie überprüfen kann.