Datentypen in Java: So funktionieren 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.

Page: 1 2

ZDNet.de Redaktion

Recent Posts

Gefahren im Foxit PDF-Reader

Check Point warnt vor offener Schwachstelle, die derzeit von Hackern für Phishing ausgenutzt wird.

11 Stunden ago

Bitdefender entdeckt Sicherheitslücken in Überwachungskameras

Video-Babyphones sind ebenfalls betroffen. Cyberkriminelle nehmen vermehrt IoT-Hardware ins Visier.

12 Stunden ago

Top-Malware in Deutschland: CloudEye zurück an der Spitze

Der Downloader hat hierzulande im April einen Anteil von 18,58 Prozent. Im Bereich Ransomware ist…

12 Stunden ago

Podcast: „Die Zero Trust-Architektur ist gekommen, um zu bleiben“

Unternehmen greifen von überall aus auf die Cloud und Applikationen zu. Dementsprechend reicht das Burg-Prinzip…

1 Tag ago

Google schließt weitere Zero-Day-Lücke in Chrome

Hacker nutzen eine jetzt gepatchte Schwachstelle im Google-Browser bereits aktiv aus. Die neue Chrome-Version stopft…

1 Tag ago

Hacker greifen Zero-Day-Lücke in Windows mit Banking-Trojaner QakBot an

Microsoft bietet seit Anfang der Woche einen Patch für die Lücke. Kaspersky-Forscher gehen davon aus,…

1 Tag ago