Generics Teil 1: Einführung

Vor kurzem wurde ich nach dem Sinn bzw. dem Einsatzzweck von <? super E> gefragt.
Bevor ich die Frage hier im Blog nochmals beantworte, kurz noch eine ganz kleine Einführung in Generics :)

Mit dem JDK 5.0 kamen die sogenannten Generics, mit denen Klassen und Methoden zusätzlich
parametisiert werden können (Ähnlich wie die Templates in C++, mit dem Unterschied, dass keine
neuen Klassen pro Parametertyp erstellt werden). Ziel der Generics ist die Lesbarkeit des Codes zu erhöhen und explizite Casts zu reduzieren. Allerdings kann die Verwendung von Generics auch sehr tückisch werden. Aber fangen wir mal einfach an (also ohne Generics):

Der folgende Codeausschnitt wird kompiliert und erzeugt zur Laufzeit eine ClassCastException. Unschön.

  1. ArrayList intList = new ArrayList();
  2. intList.add(new Double(2)); // Semantisch falsch, aber kein Fehler beim Kompilieren.
  3. Integer integer = (Integer) intList.get(0); // Ups, ClassCastException zur Laufzeit

Ungefährlicher ist Codeausschnitt 2, da hier schon der Compiler den Fehler meldet:

  1. ArrayList<Integer> intList = new ArrayList()<Integer>;
  2. intList.add(new Double(2));                 // Fehler zur Kompilierzeit
  3. Integer integer = (Integer) intList.get(0);

Mit der Verwendung der Generics wird die ArrayListe parametisiert und erlaubt nur das Hinzufügen
von Integer Objekten. Der Compiler unterbindet den fehlerhaften Aufruf und verhindert unliebsame
Überraschungen zur Laufzeit. Schön.

Morgen gibts schon weiter mit Teil 2: Wildcards. Da wirds etwas kniffliger.

Bookmark and Share

4 Responses to “Generics Teil 1: Einführung”

  1. Mirko Stocker Says:

    Schön, dass du das Thema aufgreifst, und danke für die Antwort-Mail :-)

  2. HeikoMaass Says:

    Gern geschehen :) . Ich wünsche euch viel Erfolg bei den Prüfungen.

  3. beginner Says:

    Sollte es anstelle von…

    ArrayList intList = new ArrayList();

    …nicht…

    ArrayList intList = new ArrayList();

    heißen?

  4. HeikoMaass Says:

    hallo beginner. ich glaube du meinst
    ArrayList<Integer> intList = new ArrayList()<Integer>
    anstelle von
    ArrayList<Integer> intList = new ArrayList();

    (Spitze Klammern werden von Wordpress gefiltert)

    Beides funktioniert, oberes ist etwas schöner, da der Compiler keine Warnung zurückgibt.

Leave a Reply