Warum extends?
2008-04-13 Gespeichert in: Softwareentwicklung
Java 5 bietet Generics, so dass man im Quelltext auch bei der Verwendung des Collection Frameworks ohne Casts auskommt. Aber wann und warum werden Wildcards verwendet?
Nehmen wir zum Beispiel folgende einfache Klasse:
Doch schon beim Test treten die ersten Probleme auf:
Der Constructor wird mit
Wildcards schaffen hier Abhilfe. Mit Ihnen kann der generische Code getypt aber trotzdem universell werden:
Nehmen wir zum Beispiel folgende einfache Klasse:
public class Container implements Iterable{ private final List elements = new ArrayList(); public Container(Iterable elements) { for (ELEMENT e : elements) { this.elements.add(e); } } public Iterator iterator() { return elements.iterator(); } public int getSize() { return elements.size(); }} Doch schon beim Test treten die ersten Probleme auf:
public class ContainerTest{ public void test() { Container container = new Container(Arrays.asList(new Integer [] { new Integer(2), new Integer(1)})); assertEquals(2, container.getSize()); }} Der Constructor wird mit
List aufgerufen, was nicht Iterable entspricht. Wildcards schaffen hier Abhilfe. Mit Ihnen kann der generische Code getypt aber trotzdem universell werden:
public class Container{ ... public Container(Iterable extends ELEMENT> elements) { ... } ...}Hier wird jetzt der jedes Iterable akzeptiert, dessen Elementtyp ELEMENT oder eine Subklasse davon ist.
