homedukeOOP mit Java: Bounded Wildcards Prof. Dr. Uwe Schmidt FH Wedel

Bounded Wildcards

weiter

weiter

Bounded Wildcards

Platzhalter
für unbekannte Typen, die Subtypen eines bekannten Typs sind.
weiter
Beispiel
Kollektion von Formen
 
abstract class Shape {
  abstract void draw(Canvas c);
}
weiter
 
class Circle extends Shape {
  ...
  void draw(Canvas c) { ... }
}
weiter
 
class Square extends Shape {
  ...
  void draw(Canvas c) { ... }
}
weiter
 
class Canvas {
  void drawShape(Shape s) {
    s.draw(this);
  }
  void drawShapes(List<Shape> shapes) {
    for (Shape s : shapes)
      s.draw(this);
  }
}
weiter
Anwendung
List<Circle> circles = ...;
List<Square> squares = ...;
 
Canvas       c;
 
c.drawShapes(circles);  // Fehler
c.drawShapes(squares);  // Fehler
weiter
Problem
List<Circle> und List<Square> sind keine Subtypen von List<Shape>.
schlecht
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);
  }
}
weiter
gut
Mit dem bounded wildcard-Parametertyp wird die Anwendung kompilierbar.
merke
Mit der Wildcard-Typdeklaration wird festgelegt, dass nur noch Listen mit Subtypen von Shape als Elementtyp als aktuelle Parameter erlaubt sind.
merke
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());
  }
weiter
schlecht
Übersetzungsfehler!
schlecht
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

Letzte Änderung: 28.05.2014
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel