Java Reference
In-Depth Information
Die zweite Zeile könnte etwas ausführlicher auch so geschrieben werden:
GenericStack<? extends Object> gs = gss;
Das zu Beginn dieses Abschnitts beschriebene Szenario (push über Variable gso, pop über
Variable gss) kann in diesem Fall allerdings nicht vorkommen, weil auf Wildcard-Variablen
keine Methoden angewendet werden dürfen, deren Parametertyp ein Typparameter ist. Die
folgende Zeile ist somit syntaktisch nicht korrekt:
gs.push(new Object()); //Syntaxfehler
Die eben angegebene Regel kennt allerdings eine Ausnahme: Wenn das Argument null ist,
kann die Methode angewendet werden:
gs.push(null);
Falls nur der Rückgabetyp einer Methode ein Typparameter ist, so ist dies kein Problem:
Object o = gs.pop();
Der Rückgabetyp kann weiter eingegrenzt werden, falls nicht ? extends Object angege-
ben wurde, sondern etwas Spezielleres:
class A {...}
class B extends A {...}
GenericStack<A> gsa = new GenericStack<A>(10);
gsa.push(new B());
GenericStack<? extends A> gs = gsa;
A a = gs.pop();
Wildcards können für die Typen lokaler Variablen, Attribute und Parameter sowie als Rück-
gabetypen verwendet werden. Eine Benutzung im Zusammenhang mit new ist problema-
tisch. Die folgende Codezeile ist beispielsweise nicht möglich:
GenericStack<?> gs = new GenericStack<?>(); //Syntaxfehler
Allerdings sind die folgenden Codezeilen in Ordnung und ergeben keinerlei Probleme:
class A<T> {...}
GenericStack<A<?>> gs = new GenericStack<A<?>>();
gs.push(new A<String>());
A<?> a = gs.pop();
Sollte eine Klasse mehrere Typparameter haben, so können für einen oder für mehrere
Wildcards angegeben werden:
class A<T1, T2> {...}
A<?, ?> a = new A<String,Integer>();
Einschränkungen von Wildcards können auch parametrisierte Typen sein:
class A {...}
class C<T>
{
public T get() {...}
}
 
Search WWH ::




Custom Search