Ein wichtiges Merkmal von Parametertypen ist die Fähigkeit, polymorphe Algorithmen zu schreiben, dh Algorithmen, die eine Datenstruktur unabhängig von ihrem Parameterwert bearbeiten, wie z Arrays.sort()
.
Bei Generika geschieht dies mit Platzhaltertypen:
<E extends Comparable<E>> void sort(E[]);
Um wirklich nützlich zu sein, erfordern Platzhaltertypen die Erfassung von Platzhaltern, und dies erfordert die Vorstellung eines Typparameters. Nichts davon war verfügbar, als Arrays zu Java hinzugefügt wurden, und die Erstellung von Arrays mit Referenzkovariante ermöglichte eine weitaus einfachere Möglichkeit, polymorphe Algorithmen zuzulassen:
void sort(Comparable[]);
Diese Einfachheit öffnete jedoch eine Lücke im statischen Typsystem:
String[] strings = {"hello"};
Object[] objects = strings;
objects[0] = 1;
Erfordert eine Laufzeitprüfung jedes Schreibzugriffs auf ein Array vom Referenztyp.
Kurz gesagt, der neuere Ansatz von Generika macht das Typensystem komplexer, aber auch statisch typsicherer, während der ältere Ansatz einfacher und weniger statisch typsicher war. Die Designer der Sprache entschieden sich für den einfacheren Ansatz und hatten wichtigere Dinge zu tun, als eine kleine Lücke im Typensystem zu schließen, die selten Probleme verursacht. Später, als Java eingerichtet wurde und die dringenden Anforderungen erfüllt wurden, verfügten sie über die Ressourcen, um dies für Generika richtig zu machen (aber das Ändern für Arrays hätte vorhandene Java-Programme beschädigt).