Generics Teil 3: Wildcards (und lesender Zugriff darauf)

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:

  1. ArrayList<String> stringList = new ArrayList<String>();
  2. stringList.add(new String());
  3. ArrayList<? extends CharSequence> list = stringList ;
  4. 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:

  1. ArrayList<CharSequence> csList = new ArrayList<CharSequence>();
  2. csList .add(new String());
  3. ArrayList<? super String> list = csList  ;
  4. 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)

Comments are closed.