Generics Teil 3: Wildcards (und lesender Zugriff darauf)
Sunday, September 10th, 2006Auch der lesende Zugriff auf Wildcard Referenzen ist eingeschränkt.
In einer ArrayList extends E> werden Objekte vom Typ E oder Subtypen von E gespeichert.
Da wir die obere Grenze kennen, können wir bedenkenlos die Supertypen von E (oder E selbst) aus
dieser ArrayList lesen.
Beispiel:
- ArrayList<Stringlist stringList = new ArrayList<String>();
- ArrayList<? extends CharSequence> list = stringList ;
- CharSequence cs = list.get(0); // gibt ein Objekt vom Typ CharSequence zurueck.
In einer ArrayList super E> werden Objekte vom Typ E oder die Supertypen von E gespeichert.
Hier kennen wir nur die untere Grenze, und der einzige Cast, der immer funktioniert, ist der
Cast nach Object. Von daher gibt ein lesender Zugriff immer ein Objekt vom Typ Object zurück.
Beispiel:
Ok, so weit zur Theorie. Aber wo werden diese Wildcards konkret eingesetzt ? Google hilft.
extends E> wird in der Klassenbibliothek 25 mal eingesetzt.
Z.B. Collection.addAll(Collection extends E> c)
super E> dagegen nur 9 mal.
Z.B. im Konstruktor von TreeSet(Comparator super E> c)