Bounded Wildcards lesen
Wildcards: List<? extends Number> ist eine Liste unbekannten Number-Subtyps (Producer). Man darf lesen als Number, aber nicht beliebig schreiben (ausser null).
List<? super Integer> ist Consumer: man darf Integer schreiben, Lesen liefert Object.
Merksatz PECS: producer extends, consumer super.
Beispiel: sum(List<? extends Number>) addiert Zahlen aus Listen von Integer oder Double.
$$\mathtt{List\lt ?\ super\ Integer\gt }$$
| Wildcard | add(Integer) |
|---|---|
| List<? super Integer> | typsicher |
| List<? extends Integer> | vom Compiler abgelehnt |
| ## Wo gebraucht |
PECS in Bibliotheksmethoden (addAll, Producer/Consumer von Collections). Framework-Code (Spring, Guava-ähnlich) steckt voller ? extends / ? super; Lesen der Signatur entscheidet, ob Einfügen oder nur Lesen erlaubt ist.
Vertiefung
Ein oberer Wildcard-Grenzwert beschreibt eine Quelle unbekannten, aber hinreichend speziellen Typs. Werte können sicher als Obertyp gelesen werden, doch Schreiben ist ausser null nicht möglich, weil der konkrete Untertyp unbekannt bleibt.
Ein unterer Grenzwert beschreibt dagegen ein Ziel, das Werte eines bestimmten Typs aufnehmen kann. Beim Lesen ist nur Object sicher. Diese Asymmetrie wird oft als Producer-extends, Consumer-super zusammengefasst.
Wildcards drücken Beziehungen zwischen Aufrufen aus, ohne einen Typnamen mehrfach zu binden. Wenn Ein- und Ausgabe denselben unbekannten Typ teilen müssen, ist ein benannter Methoden-Typparameter meist präziser.
Schwierigkeitsstufen
- Sichere Lese- und Schreiboperationen bestimmen.
- Oberen und unteren Grenzwert nach Datenfluss wählen.
- Wildcard und benannten Methoden-Typparameter abgrenzen.
Fallstricke
Die Grenze bezeichnet nicht den exakten Elementtyp. Bei ? extends Number darf deshalb kein beliebiges Number eingefügt werden.
Tasks
Card Info
- Topic: Algorithmen und Datenstrukturen
- Difficulty: Intermediate
- Completed: 0 users