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

Chips bescheren Samsung deutlichen Gewinnzuwachs

Das operative Ergebnis wächst um fast 6 Billionen Won auf 6,64 Billionen Won. Die Gewinne…

4 Stunden ago

Chrome: Google verschiebt das Aus für Drittanbietercookies

Ab Werk blockiert Chrome Cookies von Dritten nun frühestens ab Anfang 2025. Unter anderem gibt…

20 Stunden ago

BAUMLINK: Wir sind Partner und Aussteller bei der Frankfurt Tech Show 2024

Die Vorfreude steigt, denn BAUMLINK wird als Partner und Aussteller bei der Tech Show 2024…

22 Stunden ago

Business GPT: Generative KI für den Unternehmenseinsatz

Nutzung einer unternehmenseigenen GPT-Umgebung für sicheren und datenschutzkonformen Zugriff.

1 Tag ago

Alphabet übertrifft die Erwartungen im ersten Quartal

Der Umsatz steigt um 15 Prozent, der Nettogewinn um 57 Prozent. Im nachbörslichen Handel kassiert…

4 Tagen ago

Microsoft steigert Umsatz und Gewinn im dritten Fiskalquartal

Aus 61,9 Milliarden Dollar generiert das Unternehmen einen Nettoprofit von 21,9 Milliarden Dollar. Das größte…

4 Tagen ago