Java Reference
In-Depth Information
C<C<A>> cca = new C<C<A>>();
C<? extends C<A>> c = cca;
C<A> ca = c.get();
Auch parametrisierte Typen mit Wildcards können als Einschränkungen von Wildcards
verwendet werden:
class A {...}
class C<T>
{
public T get() {...}
}
C<C<A>> cca = new C<C<A>>();
C<? extends C<? extends A>> c = cca;
C<? extends A> ca = c.get();
Wie oben schon erwähnt wurde, kann man zwar keine Felder generischer Objekte mit kon-
kretem Typ erzeugen. Mit Wildcards ist es aber möglich:
class X<T> {}
X<Integer>[] xArray1 = new X<Integer>[10]; //Syntaxfehler
X<?>[] xArray2 = new X<?>[10];
Schließlich soll noch erwähnt werden, dass Wildcards nicht nur über extends, sondern über
das Schlüsselwort super auch auf die gegenteilige Weise eingeschränkt werden können.
Man kann damit angeben, dass nur die in super angegebene Klasse oder deren Basisklas-
sen typkompatibel sind:
class A {...}
class B extends A {...}
class C extends B {...}
class GenericClass<T> {...}
GenericClass<? super B> gc;
gc = new GenericClass<A>(); //okay
gc = new GenericClass<B>(); //okay
gc = new GenericClass<C>(); //Syntaxfehler
Die Einschränkung, dass auf eine mit einem Wildcard defi nierte Variable keine Methoden
angewendet werden dürfen, die einen Typparameter haben (Ausnahme null), bezog sich auf
Variablen, deren Wildcard mit extends verknüp war. Bei super sieht die Sache anders aus
(gc bezieht sich auf die oben mit super defi nierte Variable):
gc.setContent(new B());
gc.setContent(new A()); //Syntaxfehler
gc.setContent(new C()); //Syntaxfehler
Als Rückgabetyp bei mit super defi nierten Wildcard-Variablen kann man aber mit nicht
mehr als Object rechnen:
A a = gc.getContent(); //Syntaxfehler
B b = gc.getContent();//Syntaxfehler
Object o = gc.getContent();
 
Search WWH ::




Custom Search