Generics an Klassen
Generics parametrisieren Typen: Box speichert T. Der Compiler prüft Zuweisungen und entfernt Casts. Zur Laufzeit existiert nach Type Erasure oft nur noch die Raw-Form.
Vorteil: weniger ClassCastException, klarere APIs. Einschränkung: keine new T[], keine instanceof T mit Typparameter.
Beispiel: List akzeptiert add("a"), aber nicht add(Integer).
| Wildcard | Lesen | Schreiben |
|---|---|---|
| ? extends T | als T | meist verboten |
| ? super T | als Object | T einfügen |
| ## Wo gebraucht |
Typisierte Repositories, Event-Bus-Handler, Collection-APIs. Generics verschieben Klassenfehler auf die Compile-Zeit und sind Voraussetzung für lesbare Bibliotheksgrenzen in grossen Codebases.
Vertiefung
Ein Typparameter beschreibt eine Familie von Klassen mit gleicher Struktur, aber unterschiedlichen Elementtypen. Der Compiler prüft Einfügen und Entnehmen zusammenhängend, sodass viele Laufzeitumwandlungen entfallen.
Box<Integer> ist kein Untertyp von Box<Number>. Diese Invarianz verhindert, dass über eine vermeintliche Box<Number> etwa ein Double in eine tatsächlich ganzzahlige Box geschrieben wird.
Statische Member gehören zur Klasse und nicht zu einer konkreten Typargument-Ausprägung. Sie können den Typparameter der Instanzklasse daher nicht unmittelbar verwenden. Methoden können stattdessen eigene Typparameter deklarieren.
Schwierigkeitsstufen
- Einen Klassen-Typparameter an Feldern und Methoden einsetzen.
- Invarianz anhand eines unsicheren Schreibzugriffs begründen.
- Klassen- und Methoden-Typparameter unterscheiden.
Fallstricke
Ein einzelner Buchstabe ist kein konkreter Laufzeittyp. Ausserdem beseitigt ein ungeprüfter Cast nur die Compilerkontrolle, nicht die Möglichkeit eines späteren Typfehlers.
Tasks
Card Info
- Topic: Algorithmen und Datenstrukturen
- Difficulty: Intermediate
- Completed: 0 users