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

Typparameter mit Wildcards

weiter

weiter

Wildcards

Platzhalter
für unbekannte Typen
Beispiel
Eine Methode zum Ausgeben der Werte einer beliebigen Collection
weiter
ohne Generics
mit Java <= 1.4
 
void printCollection(Collection c) {
  Iterator i = c.iterator();
  while ( i.hasNext() )
    System.out.println(i.next());
}
weiter
naiver Ansatz
mit Java >= 1.5 und Generics
 
void printCollection(Collection<Object> c) {
  for(Object e : c)
    System.out.println(e);
}
weiter
richtiger Ansatz
mit Java >= 1.5, Generics und Wildcards
 
void printCollection(Collection<?> c) {
  for(Object e : c)
    System.out.println(e);
}
weiter
Lösung
Syntaxerweiterung für generische Typen mit unbekanntem Parametertyp.
merke
? steht für einen unbekannten Typ.
merke
Ein unbekannter Typ wird als spezieller als alle Typen aufgefasst.
Damit sind Zuweisungen (und Parameterübergaben) an Variablen dieses unbekannten Typs verboten.
Damit sind Zuweisungen an Variablen vom Typ Object möglich.
im Beispiel
Über die Elemente der Kollektion ist nichts bekannt, außer dass sie alle Eigenschaften von Object besitzen.
Zuweisungen
Collection<?> c;
Object        o;
X             x;
 
o = c.get(0);  // o.k.
 
c.add(o);      // Fehler
c.add(x);      // Fehler fuer alle X

weiter

Test

für Zuweisungskompatibilität mit Generics und Wildcards

   1import java.util.Collection;
   2
   3class C {
   4    void f() {
   5        Collection<?>  c,  c2 = null;
   6        Collection<Object> co = null;
   7        Collection<String> cs = null;
   8
   9        c = co;
  10        c = cs;
  11        c = c2;
  12
  13        c2 = c;
  14        co = c;
  15        cs = c;
  16
  17        co = cs;
  18        cs = co;
  19
  20        co = (Collection<Object>)c;
  21        co = (Collection<Object>)cs;
  22
  23        Object o;
  24
  25        o = c.iterator().next();
  26        c.add(o);
  27    }
  28}

javac -Xlint C.java


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