Auch 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<String> stringList = new ArrayList<String>();
-
stringList.add(new String());
-
ArrayList<? extends CharSequence> list = stringList ;
-
CharSequence cs = list.get(0); // gibt ein Objekt vom Typ CharSequence zurueck.
In einer ArrayList<strong><? 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:
-
ArrayList<CharSequence> csList = new ArrayList<CharSequence>();
-
csList .add(new String());
-
ArrayList<? super String> list = csList ;
-
Object o = list.get(0); // gibt ein Objekt vom Typ Object zurueck.
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)