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);
}
merke
Collection<String> sc;
...
printCollection(sc)// Fehler !!!
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
class Collection<E> {
  ...
  E get(...) {...}
  void add(E e1) {...}
}
 
Collection<?> c;
Object        o;
X             x;
 
o = c.get(...);  // o.k.
 
c.add(o);        // Fehler
c.add(x);        // Fehler fuer alle X

weiter

Test

für Zuweisungskompatibilität mit Generics und Wildcards mit der JDK Klasse Collection

   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: 28.05.2014
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel