Das offizielle Java-Tutorial zu Generics erklärt das Löschen von Typen und warum es dem Compiler hinzugefügt wurde:
Wenn ein generischer Typ instanziiert wird, übersetzt der Compiler diese Typen mit einer Technik, die als Typlöschung bezeichnet wird - ein Prozess, bei dem der Compiler alle Informationen zu Typparametern und Typargumenten in einer Klasse oder Methode entfernt. Mit der Typlöschung können Java-Anwendungen, die Generika verwenden, die Binärkompatibilität mit Java-Bibliotheken und Anwendungen aufrechterhalten, die vor Generika erstellt wurden.
Dies war höchstwahrscheinlich ein pragmatischer Ansatz oder der am wenigsten schmerzhafte. Was kann jedoch getan werden, nachdem Generika in der gesamten Branche allgemein unterstützt werden, damit wir keine Typlöschung mehr benötigen? Ist es machbar, ohne die Abwärtskompatibilität aufheben zu müssen, oder ist es praktisch, wenn es machbar ist?
Ist die letzte Aussage im obigen Zitat selbstreferenzierend geworden? Das heißt: "Mit der Typlöschung können Java-Anwendungen, die Generika verwenden, die Binärkompatibilität mit Java-Bibliotheken und Anwendungen aufrechterhalten, die mit Java-Versionen erstellt wurden, die die Typlöschung durchführen."
Antworten:
Das Ende der Lebensdauer gilt für das Java Development Toolkit und die Java Runtime Environment. Und nur die Oracle (Sun) -Versionen. Dies gilt jedoch nicht für Anträge Dritter. Die Absicht ist, niemals Code zu brechen, der jemals auf der JVM ausgeführt wurde. Daher ist es unwahrscheinlich, dass Java jemals aufhören wird, den Typ zu löschen.
Natürlich hat C # in einer späteren Version auch Generika in abwärtskompatibler Weise eingeführt, ohne dass eine Typlöschung durchgeführt wurde, aber im Grunde bedeutete dies, dass alle Auflistungsklassen dupliziert wurden. Ich nehme an, Java-Designer möchten das nicht und haben sich daher zunächst für die Löschung von Datentypen entschieden. Ohne Werttypen ist der Vorteil nicht typgelöschter Generika nicht so groß.
quelle
List<int>
Workload wahrscheinlich viel effizienter machen würde als die aktuelleList<Integer>
.