Durch die Einführung der Generics wurde die Programmiersprache Java sinnvoll erweitert. Den Programmierern wurde nun endlich erstmals die Möglichkeit gegeben, garantiert typsicher zu programmieren. Gleichzeitig ist die Ausdruckskraft der Sprache gestiegen.
Die gewählte Form der Umsetzung dieses Prinzips ist differenziert zu bewerten. So ist es positiv, dass alter Java-Code noch immer verwendet werden kann. Auch ist der Einstieg in die Generics in vielen Fällen recht leicht; man kann wie gewohnt programmieren und "mal" eine Liste von Strings oder ähnliches verwenden.
Möchte man jedoch auch nur wenig anspruchsvollere Aufgaben mit Generics realisieren, ist aufgrund der Implementierung mitsamt Rückführung auf die Raw Types fast immer eine Einarbeitung in die Materie nötig. Die Fehlermeldungen wie z. B. im Falle der Methoden, die sich nur durch den Typparameter des Methodenparameters unterschieden, können ohne das Wissen um die Form der Implementierung und der Übersetzung durch den Compiler sehr verwirrend sein. Auch die vielen nötigen unchecked typecasts sorgen an einigen Stellen wieder für "Löcher" in der Typsicherheit.
Positiv ist jedenfalls an der gewählten Technik, dass es zumindest zu keinen Performanceverlusten aufgrund von Generizität kommt. Wie gezeigt, sind Typecasts jedoch intern noch immer nötig, so dass auch kein Performancegewinn erreicht wurde. Es sind durchaus Umsetzungstechniken denkbar, mit denen dieser möglich gewesen wäre; jedoch zum Preis der Anpassung der Virtual Machine.
Der Protocompiler, den die Entwickler der Generics entwickelt und mit ihm getestet haben, sollte jedoch Code generieren, der mit den vorhandenen VMs funktionieren sollte. Hier spielte sicher auch eine gewisse Bequemlichkeit eine Rolle.
Insgesamt denke ich aber, dass durch die gewählte Form eine schnelle Akzeptanz in den Programmiergemeinden und insbesondere auch bei Entwicklern in Firmen geschaffen werden kann. Gerade letztere hätten häufig nicht die Zeit, sich mit einer kompletten neuen Java-Klassenbibliothek zu beschäftigen, welche im Falle einer Änderung der VM nötig gewesen wäre, um Rückwärtskompatibilität zu gewährleisten. So jedoch sind "Early Wins" möglich, also schnelle Erfolgserlebnisse beim Verwenden der neuen Technik. Dadurch wird eher die Bereitschaft geweckt, sich eingehend mit den kritischeren Fällen auseinander zu setzen, um auch schwierige Problemstellungen zu lösen.
Von dem Standpunkt einer sauberen, perfekten Umsetzung des theoretischen Prinzips bleiben aber die gezeigten Probleme als teilweise schwerwiegende Kritikpunkte.
Ausblick
Einige Aspekte der Generics in Java wurden im Rahmen dieser Arbeit nicht oder nur am Rande erwähnt, um den Umfang übersichtlich zu halten. Diese sollen hier als Anregung für weitere Studien genannt werden.
Mehrere Typparameter für eine generische Klasse wurden nicht detailliert beleuchtet. Diese verhalten sich aber analog zu den einfachen Typparametern und können exemplarisch am Interface
Map
untersucht werden.
Das Verhalten der Generizität bei inneren Klassen wurde ebenfalls nicht untersucht. Aber auch hier gibt es keine wesentlichen Veränderungen zu den bisher gezeigten Eigenschaften, und diese lassen sich logisch aus dem gezeigten Material ableiten.
Konkrete, umfangreichere Anwendungsbeispiele wurden ebenfalls nicht vorgestellt. Auch für das Schlüsselwort
super
im Zusammenhang mit den Einschränkungen kann ein konkretes Beispiel hilfreich sein. Es sei an dieser Stelle vielleicht erwähnt, dass ein Beispiel eine Erzeuger-Verbraucher-Beziehung ist: Ein Erzeuger produziert Elemente, die mindestens von einem bestimmten Typ sind, und kann diese Verbrauchern zukommen lassen, die diesen Typ oder einen höheren (also mit weniger Eigenschaften) akzeptieren.
Die Erstellung weiterer Anwendungsbeispiele kann eine gute Übung im Umgang mit Generics sein. In der Tat verbergen sich jedoch in den meisten Problemstellungen, die mit einem Java-Programm gelöst werden, bereits viele Möglichkeiten für den Einsatz von Generics.