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.
Vorher hilfreich
Lerninhalt
Verstehen & anwenden
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.
List<String> namen = new ArrayList<>();
namen.add("Ada");
// namen.add(42); // Compilerfehler: kein String
String erster = namen.get(0); // kein Cast nötigEigene 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.
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();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.
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.
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
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
Erkennen: Welcher Abschnitt passt?
Welcher Abschnitt passt zu diesen Begriffen?
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.
Fortschritt
Bereit zum Abschließen?
Markiere die Lektion als abgeschlossen, um XP und Streak zu erhalten.