Java Reference
In-Depth Information
{
public void m(ArrayList<A> list)
{
}
public void m(ArrayList<B> list)
{
}
}
Der Compiler meldet für diesen Code folgenden Fehler: “Method m(ArrayList<A>) has the
same erasure m(ArrayList<T>) as another method in type C”.
1 .6 Typenkompatibilität und Wildcards
Eine interessante Frage ist, welche generischen Typen kompatibel zueinander sind. Diese
Frage spielt bei einer Zuweisung eine Rolle (Typen auf der linken und rechten Seite einer
Zuweisung) oder bei einem Methodenaufruf (Typen der formalen Parameter in einer Metho-
dendeklaration und Typen der konkreten Parameter bei einem Methodenaufruf). Betrach-
ten wir zunächst die Situation ohne Generics. Wie Sie sicher wissen, sind die folgenden
zwei Code-Zeilen unproblematisch:
String s = new String("hallo");
Object o = s; //okay
In der zweiten Zeile ist der Typ links des Zuweisungszeichens Object, rechts davon String.
Dies ist aber kein Problem, da jedes Objekt des Typs String auch ein Objekt des Typs Object
ist. Das Umgekehrte gilt bekanntlich nicht:
Object o = new Object();
String s = o; //Syntaxfehler
Einer Variablen des Typs String kann kein Objekt des Typs Object zugewiesen werden (Syn-
taxfehler „Type mismatch: cannot convert from Object to String“). Es wäre zwar möglich auf
String zu casten. Dann wäre man zwar den Syntaxfehler los, würde sich aber beim Ausfüh-
ren des Programms eine ClassCastException einfangen.
Man würde nun vermutlich erwarten, dass die gezeigte Verträglichkeit im Zusammenhang
mit Generics ähnlich ist, dass also einer Variablen eines Object-Stacks ein String-Stack
zugewiesen werden könnte:
GenericStack<String> gss = new GenericStack<String>(10);
GenericStack<Object> gso = gss; //Syntaxfehler
Dies geht aber nicht, denn sonst könnte man über die Variable gso ein beliebiges Objekt auf
den Keller legen. Wenn man über die Variable gss dann von demselben Keller dieses Objekt
wieder entfernen würde, würde man fälschlicherweise einen String erwarten:
gso.push(new Object()); //nicht möglich, da oben Syntaxfehler
String s = gss.pop();//nicht möglich, da oben Syntaxfehler
 
Search WWH ::




Custom Search