Platzhalter |
für unbekannte Typen, die Subtypen eines
bekannten Typs sind.
|
| |
Beispiel |
Kollektion von Formen
|
|
abstract class Shape {
abstract void draw(Canvas c);
}
|
| |
|
class Circle extends Shape {
...
void draw(Canvas c) { ... }
}
|
| |
|
class Square extends Shape {
...
void draw(Canvas c) { ... }
}
|
| |
|
class Canvas {
void drawShape(Shape s) {
s.draw(this);
}
void drawShapes(List<Shape> shapes) {
for (Shape s : shapes)
s.draw(this);
}
}
|
| |
Anwendung |
List<Circle> circles = ...;
List<Square> squares = ...;
Canvas c;
c.drawShapes(circles);
c.drawShapes(squares);
|
| |
Problem |
List<Circle> und List<Square> sind keine Subtypen von List<Shape>.
|
|
Die Anwendung enthält Fehler und wird nicht kompiliert.
|
Ziel |
drawShapes soll mit jeder Liste arbeiten können, deren Elementtyp zwar unbekannt,
aber Subtyp von Shape ist.
|
Lösung
|
Ein Wildcard-Typ, der Subtyp von Shape ist.
|
|
class Canvas Canvas {
...
void drawShapes(List<? extends Shape> shapes) {
for (Shape s : shapes)
s.draw(this);
}
}
|
| |
|
Mit dem bounded wildcard-Parametertyp wird die Anwendung kompilierbar.
|
|
Mit der Wildcard-Typdeklaration wird festgelegt,
dass nur noch Listen mit Subtypen von Shape als Elementtyp als aktuelle Parameter erlaubt sind.
|
|
Shape bildet eine sogenannte obere Schranke für die Elementtypen.
|
Einschränkung |
In Methoden mit (bounded) Wildcard-Parametertypen sind keine schreibenden Operationen
mit diesen Parametern mehr erlaubt.
|
|
void addSquare(List<? extends Shape> shapes) {
shapes.add(0, new Square());
}
|
| |
|
Übersetzungsfehler!
|
|
Sonst könnte in eine Liste von Circles ein
Square-Objekt eingefügt werden.
|
|
für generische verkettete Listen modelliert mit Ist-ein-Beziehungen und Vererbung
|