2009-09-25 12 views

Antwort

5

Java-Generics werden vom Java-Compiler behandelt und zur Kompilierungszeit in eine nicht-generische Version konvertiert. Dies unterscheidet sich von .NET, wo die CLR erstklassige Unterstützung für Typparameter bietet. Auf der Bytecode-Ebene wird ArrayList<T> nur eine einfache ArrayList sein.

zu zitieren Java docs:

Generics implementiert werden durch den Java-Compiler als Conversion-Front-End Löschen genannt, was der Prozess des Übersetzens oder Umschreiben Code ist, dass Generika in nicht-generic-Code verwendet (das heißt, ordnet die neue Syntax der aktuellen JVM-Spezifikation zu). Mit anderen Worten, diese Konvertierung löscht alle generischen Typinformationen. Alle Informationen zwischen spitzen Klammern werden gelöscht. Zum Beispiel wird LinkedList<Integer>LinkedList werden. Verwendungen anderer Typvariablen werden durch die Obergrenze der Typvariablen ersetzt (z. B. Object). Wenn der resultierende Code nicht korrekt ist, wird eine Umwandlung in den entsprechenden Typ eingefügt.

+4

Ich mag Java Generics aus diesem Grund nicht. Generika sollten ein Hauptmerkmal gewesen sein, aber stattdessen war es nicht viel mehr als syntaktischer Zucker, um zu vermeiden, dass man Objekte auf einen bestimmten Typ umwandelt. Zucker ist wunderbar, aber es hätte so viel mehr sein können. Mumble-Typen und so fügen Sie tatsächlich Wert hinzu, also ist es nicht alles schlecht. – Joren

+1

@Joren, Sie sind unnötig streng auf Generika. Während das Löschen von Text sicherlich enttäuschend ist, sind Generika sicherlich eine deutliche Verbesserung gegenüber der Umwandlung von Object, da wir nun alle Kompilierzeitgarantien des Java-Typsystems mit unseren generalisierten Klassen haben können. – Falaina

+3

Aber die generischen Informationen sind immer noch in der kompilierten Klassendatei als Metadaten verfügbar (sonst wäre 'javac' nicht in der Lage Generika zu prüfen). Konnte IKVM diese Informationen nicht verwenden? –

Verwandte Themen