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

1. Januar 2025: Umstieg auf E-Rechnung im B2B-Geschäftsverkehr

Cloud-Plattform für elektronische Beschaffungsprozesse mit automatisierter Abwicklung elektronischer Rechnungen.

3 Stunden ago

Google schließt schwerwiegende Sicherheitslücken in Chrome 131

Mindestens eine Schwachstelle erlaubt eine Remotecodeausführung. Dem Entdecker zahlt Google eine besonders hohe Belohnung von…

4 Stunden ago

Erreichbarkeit im Weihnachtsurlaub weiterhin hoch

Nur rund die Hälfte schaltet während der Feiertage komplett vom Job ab. Die anderen sind…

21 Stunden ago

Hacker missbrauchen Google Calendar zum Angriff auf Postfächer

Security-Experten von Check Point sind einer neuen Angriffsart auf die Spur gekommen, die E-Mail-Schutzmaßnahmen umgehen…

2 Tagen ago

Bedrohungen in Europa: Schwachstellen in der Lieferkette dominieren

Hinter 84 Prozent der Zwischenfälle bei Herstellern stecken Schwachstellen in der Lieferkette. Auf dem Vormarsch…

2 Tagen ago

Bericht: Apple arbeitet an faltbarem iPad

Es kommt angeblich 2028 auf den Markt. Das aufgeklappte Gerät soll die Displayfläche von zwei…

3 Tagen ago