Wie kann Java verbessert werden, damit es keine Typlöschung mehr durchführen muss?

16

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."

Ein Benutzer
quelle
1
Die Sonne 1.4 wurde EOL'ed. IBM unterstützt weiterhin 1.4 auf ihren Plattformen.
@ ThorbjørnRavnAndersen: Und zumindest für die Plattform, die sich im Keller meines Vaters befindet, gibt es keine 1.5.
Jörg W Mittag
@ ThorbjørnRavnAndersen Nicht nur das, sondern man kann auch erweiterten Support für viel frühere Versionen der JVM erwerben. Zuletzt habe ich gehört, obwohl es ziemlich teuer ist.
maple_shaft
1
Keiner von uns hier besitzt eine Kristallkugel, daher ist sie nicht verantwortlich. Vielleicht kann es wieder geöffnet werden, wenn Sie die Frage von "Wird es jemals ..." zu "Was muss erreicht werden, damit Type Erasure in einer zukünftigen Version von Java ausgeführt werden kann"
umformulieren
@ JörgWMittag wäre das eine Plattform, die 2012 tatsächlich für die Produktion genutzt wird?

Antworten:

7

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ß.

Jan Hudec
quelle
6
Das OpenJDK-Team hat darüber gesprochen, sich erneut mit reified Generics zu befassen. Wahrscheinlich wird dies während des Zeitrahmens von Java 9 ernsthaft untersucht und, sofern dies technisch machbar ist, innerhalb des Zeitrahmens von Java 10 geliefert. Aber das ist ernstes Wahrsagen von meiner Seite.
Martijn Verburg
Die Typlöschung erfolgt durch den Compiler, nicht durch die JVM. Die Einführung neuer Generika würde einen neuen Compiler und eine neue JVM erfordern, wahrscheinlich funktionieren sie jedoch weiterhin mit altem Code.
Gabe
@Gabe: Offensichtlich würden sie in einer neuen Version eingeführt, also gäbe es einen neuen Compiler und eine neue JVM. Es ist jedoch auch erforderlich, einen wesentlichen Teil der Standardbibliothek zu duplizieren, da dann generische Versionen für neuen Code und nicht generische Versionen für die Abwärtskompatibilität erforderlich wären. .NET hat genau das in Version 2.0 getan, Java hat es mit Erasure vermieden. .NET verfügt über Werttypen (struct), deren erstklassige Unterstützung das Löschen von Typen ausschließt. Java nicht, daher ist der Druck für reifizierte Generika viel geringer.
Jan Hudec
Jan: Ich habe nur die Tatsache kommentiert, dass das Ändern von Generika nicht automatisch bedeutet, dass der gesamte alte Code kaputt ist. Ich würde auch hinzufügen, dass eine List<int>Workload wahrscheinlich viel effizienter machen würde als die aktuelle List<Integer>.
Gabe
@Gabe: Da sind wir uns nicht einig. Ich wollte nur den Hauptnachteil bemerken.
Jan Hudec