Zum Inhalt springen
Lektion 20 von 26 14 Min. Fortgeschritten Zur Übung Mit Codebeispiel

Generics

Generics sagen dem Compiler, welche Art von Werten in einer Struktur steckt. Dadurch fällt ein falscher Typ schon beim Kompilieren auf — nicht erst zur Laufzeit.

Ansicht

01

Verstehen

Lies die Kernidee und das Beispiel.

02

Prüfen

Beantworte die Aktiv-Checks.

03

Anwenden

Setze die Transferaufgabe um.

Mini-Erfolg

Deine Box<T> nimmt einen String und eine Zahl auf, ohne Cast.

Warum das wichtig ist: Generics sind der Grund, warum List<String> dir beim Kompilieren hilft, statt erst zur Laufzeit zu crashen.

Das darf schwer sein

Das ist ein Fortgeschrittenen-Thema. Lies es einmal in Ruhe, baue das Mini-Projekt und komm später zurück. Du musst es nicht sofort können.

Lerninhalt

Verstehen & anwenden

1

Warum Generics?

Ohne Generics müsstest du alles als Object speichern und beim Herausholen casten.

Fehler würden erst spät auffallen.

Mit List<String> weiß der Compiler: Hier gehören nur Strings hinein. Das ist Sicherheit, keine Schikane.

<T>TypsicherheitCast
Mit und ohne Generics
List<String> namen = new ArrayList<>();
namen.add("Ada");
// namen.add(42); // Compilerfehler: kein String

String erster = namen.get(0); // kein Cast nötig
2

Eigene generische Klasse

Ein Typparameter wie T ist ein Platzhalter.

Beim Verwenden legst du den konkreten Typ fest.

So funktioniert eine Box für Strings genauso wie eine für Integer — ohne doppelten Code.

Box<T>get()set()
Box<T>
public class Box<T> {
    private T wert;

    public void set(T wert) {
        this.wert = wert;
    }

    public T get() {
        return wert;
    }
}

Box<String> text = new Box<>();
text.set("Hallo");
String s = text.get();
3

Grenzen und Wildcards

Mit extends kannst du den Typ einschränken: T extends Number erlaubt nur Zahlen.

Wildcards wie List<? extends Number> bedeuten: Eine Liste von irgendetwas, das Number ist. Für den Einstieg reicht: erst die Grundidee, Wildcards später.

extends?Wildcard
Eingeschränkt
public static double summe(List<? extends Number> zahlen) {
    double summe = 0;
    for (Number zahl : zahlen) {
        summe += zahl.doubleValue();
    }
    return summe;
}

Vertiefung

Typsicherheit zur Compile-Zeit

Generics verschieben Typfehler vom Laufzeit- in den Compile-Zeitpunkt. List<String> kann keine Integer aufnehmen — der Compiler verhindert es, bevor das Programm startet.

Zur Laufzeit sind die Typinformationen weitgehend gelöscht (Type Erasure). Deshalb kann man keine new T() schreiben und keine primitiven Typen als Typparameter verwenden.

Box mit zwei Typen
record Pair<A, B>(A links, B rechts) {}

Pair<String, Integer> eintrag = new Pair<>("Alter", 25);
String name = eintrag.links();
int alter = eintrag.rechts();

Merksatz: Generics machen Wiederverwendung sicher. Der Compiler prüft den Typ, nicht erst die Laufzeit.

Übungsaufgabe

Box und Pair

Schreibe eine generische Box<T> und einen generischen Record Pair<A, B>. Probiere beide mit unterschiedlichen Typen aus.

Das soll dein Programm können

  • Box<T> mit set und get
  • Pair<A, B> als Record
  • Box<String> und Box<Integer> verwenden
  • Pair<String, Integer> ausgeben

Schreibe den Code hier oder in deiner IDE und vergleiche ihn dann mit der Lösung.

Dein Code wird automatisch auf diesem Gerät gespeichert.

Hinweis anzeigen

In Box<T> ist T der Platzhalter für den konkreten Typ. Beim Erzeugen entscheidet new Box<String>(), was hineinpasst.

Lösung anzeigen
Box und Pair.java
public class Generics {
    static class Box<T> {
        private T wert;
        void set(T wert) { this.wert = wert; }
        T get() { return wert; }
    }

    record Pair<A, B>(A links, B rechts) {}

    public static void main(String[] args) {
        Box<String> text = new Box<>();
        text.set("Hallo");
        Box<Integer> zahl = new Box<>();
        zahl.set(42);

        Pair<String, Integer> pair = new Pair<>("Alter", 25);
        System.out.println(text.get() + " / " + zahl.get());
        System.out.println(pair.links() + ": " + pair.rechts());
    }
}

Warum funktioniert das?

Beide Box-Instanzen nutzen denselben Code, aber mit unterschiedlichen Typparametern. Der Compiler verhindert, dass in text eine Zahl landet.

Aktiv-Check

Teste dein Verständnis

1/6

Erkennen: Welcher Abschnitt passt?

Welcher Abschnitt passt zu diesen Begriffen?

<T>TypsicherheitCast
Tipp: Erst erinnern, dann prüfen. Fehler sind Teil des Lernens.

Spaßprojekt

Die Alles-Box

Schreibe eine generische Klasse Box<T> mit get() und set(). Probiere sie mit String, Integer und deiner eigenen Klasse aus.

Selbstcheck

Kann ich das schon?

Hake ab, was du wirklich erklären oder selbst bauen könntest.

0 von 3 geschafft

Fortschritt

Bereit zum Abschließen?

Markiere die Lektion als abgeschlossen, um XP und Streak zu erhalten.

</> Learn-Program © 2026 · Lizenziert unter CC BY-NC-SA 4.0

Rechtliches & Lizenz