Hallo Leute...
Ich habe mir gerade folgende dinge durchgelsen:
und auch diesen Artikel auf Wiki: Wildcard (Java) - Wikipedia, the free encyclopedia
Doch leider begreife ich immer noch nicht ganz wann ich super nutze und wann extends...
extends nehme ich dann, wenn die collection die ich der Methode übergebe Klassen enthält die von der angebenen Klasse sind oder von dieser abgeleitet sind... (direkt oder indirekt)...
Aber wann super?
Ich habe mir gerade folgende dinge durchgelsen:
Der Vollständigkeit halber wollen wir noch die sogenannten Wildcard-Instanziierungen parametrisierter Typen erwähnen. Bisher haben wir ausschließlich Instanziierungen von parametrisierten Typen gezeigt, bei denen der Typparameter durch einen konkreten Typ ersetzt war. Ein Beispiel ist List<String>. Nun kann man aber nicht nur konkrete Typen für den Typparameter einsetzen, sondern auch sogenannte Wildcards. Es gibt 3 Arten von Wildcards: "? extends Type", "? super Type" und "?". Wildcard-Instanziierungen sehen dann zum Beispiel so aus: List<? extends Number>, oder List<? super Long> oder List<?>.
Ein Wildcard bezeichnet keinen konkreten Typ, sondern eine Familie von Typen. Das Wildcard "? extends Number" bezeichnet beispielsweise die Menge aller Typen, die vom Typ Number direkt oder indirekt abgeleitet sind, d.h. die Familie aller Subtypen von Number, also Long, Integer, usw., inklusive Number selbst. Die Wildcard-Instanziierung List<? extends Number> bezeichnet daher logischerweise die Familie aller Instanziierungen des parametrisierten Typs List, bei dem ein Typ aus der Familie der Subtypen von Number für den Typparameter eingesetzt wurde, also List<Long>, List<Integer>, usw. inklusive List<Number>. Ein Wildcard wie "? super Long" bezeichnet die Familie aller Supertypen von Long und das Wildcard "?" steht für die Menge aller Typen.
Eine Wildcard-Instanziierung eines parametrisierten Typs kann verglichen mit einer konkreten Instanziierung nicht dazu verwendet werden, um Objekte zu erzeugen. Man kann zwar eine Variable vom Typ List<? extends Number> deklarieren, aber man kann kein Objekt vom Typ List<? extends Number> erzeugen. Eine Variable vom Typ List<? extends Number> kann aber auf Objekte von kompatiblen Typen verweisen. Die kompatiblen Typen sind genau die Typen aus der Familie von Typen, die die Wildcard-Instanziierung bezeichnet. Eine Referenzvariable vom Typ List<? extends Number> kann also auf ein Objekt vom Typ List<Long> oder List<Integer> usw. verweisen. Analog kann eine Variable vom Typ List<? super Long> auf Objekte vom Typ List<Long> oder List<Number> oder List<Comparable> usw. verweisen. Eine Variable vom Typ List<?> kann auf beliebige Instanziierungen von List verweisen.
Der Zugriff auf ein Objekt, das über eine Referenzvariable vom Typ Wildcard-Instanziierung referenziert wird, ist eingeschränkt. Über eine Variable vom Typ List<? extends Number> beispielsweise dürfen keine Methoden des Typs List aufgerufen werden, die ein Argument vom dem Typ nehmen, für den das Wildcard steht. Hier ist ein Beispiel:
List<? extends Number> list = new LinkedList<Integer>();
list.add(new Integer(25)); // compile-time error
Bei einem Wildcard mit "super" ist der Aufruf von Methoden unmöglich, deren Returntyp vom dem Typ ist, für den das Wildcard steht. Für das "?" Wildcard gelten beide Einschränkungen.
Warum diese Einschränkungen gelten, wollen wir an dieser Stelle nicht erläutern, weil es den Rahmen des Artikels sprengen würde. Auch auf die Benutzung der Wildcard-Instanziierungen können wir an dieser Stelle nicht eingehen. In der Praxis wird man Wildcard-Instanziierungen in der Regel als Argument- und Returntyp von Methoden finden, und eher seltener für die Deklaration von Referenzvariablen. Dabei dürfte das Wildcard mit "extends" am häufigsten Verwendung finden. In den J2SE 1.5 Plattform-Bibliotheken findet man Beispiele dafür (siehe z.B. die Methode boolean addAll(Collection<? extends E> c) der Klasse java.util.List).
und auch diesen Artikel auf Wiki: Wildcard (Java) - Wikipedia, the free encyclopedia
Doch leider begreife ich immer noch nicht ganz wann ich super nutze und wann extends...
extends nehme ich dann, wenn die collection die ich der Methode übergebe Klassen enthält die von der angebenen Klasse sind oder von dieser abgeleitet sind... (direkt oder indirekt)...
Aber wann super?