Datentypen in Java: So funktionieren Generics

Generics sind fortgeschrittene Datentypen. Sie ermöglichen eine Typüberprüfung, um sicherzustellen, dass nur Objekte des gewünschten Typs in Collections eingefügt werden. Der Artikel erklärt die Funktionsweise von Generics.

Generics überprüfen, ob die richtige Art von Komparator für Objekte verwendet wird, die sortiert werden sollen. Die Typüberprüfung erfolgt vorrangig während des Kompilierens. In C++ gibt es übrigens eine ähnliche Funktion, die so genannten Templates.

So funktionieren Generics

Alle Collection-Klassen von Java, zum Beispiel HashMap, ArrayList und TreeList, enthalten nur generische Objekte. Das Problem dabei ist, dass man selbst darauf achten muss, welche Art von Objekten sich in jeder Kollektion befindet. Der Compiler gibt keine Warnung aus, wenn beispielsweise eine Katze einer Kollektion von Hunden hinzugefügt wird.

Java 1.5 hat Generics mit einem großen Overhead implementiert. Sowohl beim Hinzufügen von Objekten zu einer Kollektion als auch beim Auslesen werden implizite Typumwandlungen (Casts) durchgeführt. Der Compiler verwandelt automatisch alle hinzugefügten Objekte – dem Beispiel folgend – in Hunde und wandelt sie auch beim Auslesen wieder entsprechend um. Innerhalb der Kollektion werden sie als generische Objekte behandelt.

Theoretisch ist keine dieser beiden zeitaufwändigen Typumwandlungen notwendig. Lässt man sie jedoch weg, führt das zu einer Sicherheitslücke in der JVM, die arglistig ausgenutzt werden kann.

Das Autoboxing-Verfahren

Generische Java-Klassen können nur Objekte als formale Typparameter übernehmen: List<Integer> lässt sich kompilieren, nicht aber List<int>. Dank des Autoboxing-Verfahrens kann man auch einen Grundtyp wie int zu List<Integer> hinzufügen. Der Begriff Autoboxing beschreibt das Einfügen eines Grundtyps als Objekttyp, ohne zusätzlichen Code schreiben zu müssen. Der Compiler liefert dabei automatisch den erforderlichen Extracode zur Durchführung der Typumwandlung.

So erlaubt Java seit J2SE 5.0 etwa das Erstellen einer Linked-List von int-Elementen. Eine Linked-List kann allerdings nur Objekte enthalten, nicht aber Grundtypen. Wenn Java also ein Objekt erwartet, jedoch einen Grundtyp erhält, konvertiert es ihn unverzüglich in ein Objekt.

Diese Aktion wird Autoboxing genannt, weil das Einfügen automatisch und implizit erfolgt. Der Entwickler muss sich also nicht selbst darum kümmern. Unboxing bezieht sich entsprechend auf einen eingefügten Grundtyp, der zurückverwandelt wird, um beispielsweise für eine mathematische Operation abrufbar zu sein. Hier ein Codebeispiel, das Generics und Autoboxing verwendet:



Generics werden während der Kompilierzeit auf Korrektheit überprüft. Die Information über den generischen Typ wird dann mithilfe eines Verfahrens namens Type-Erasure entfernt und nur für die Oberklasse aufbewahrt. So wird zum Beispiel List<Integer> in den – nicht generischen – Raw-Typ List umgewandelt, der beliebige Objekte enthalten kann. Die Überprüfung in Kompilierzeit garantiert, dass der Code typkorrekt ist, solange er keine ungeprüften Compilerwarnungen erzeugt.

Themenseiten: Anwendungsentwicklung, Software

Fanden Sie diesen Artikel nützlich?
Content Loading ...
Whitepaper

ZDNet für mobile Geräte
ZDNet-App für Android herunterladen Lesen Sie ZDNet-Artikel in Google Currents ZDNet-App für iOS

Artikel empfehlen:

Neueste Kommentare 

Noch keine Kommentare zu Datentypen in Java: So funktionieren Generics

Kommentar hinzufügen

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *