Java Reference
In-Depth Information
welt.setContent("welt");
GenericClass<Integer> i1 = new GenericClass<Integer>();
i1.setContent(47);
GenericClass<Integer> i2 = new GenericClass<Integer>();
i2.setContent(11);
Exchange.exchange(hallo, welt);
Exchange.exchange(i1, i2);
Nach wie vor ist es aber nicht möglich, zueinander unverträgliche Objekte als Parameter in
einem Aufruf von exchange anzugeben:
Exchange.exchange(hallo, i1); //Syntaxfehler
Bei einem Aufruf einer generischen Methode sind alle Typen kompatibel, die zu beiden Para-
metern passen. Betrachten wir dazu die folgende Klasse X mit der generischen Methode m:
class X
{
public static <T> T m(T t1, T t2)
{
...
}
}
Selbstverständlich ist Object als Rückgabetyp für T immer verträglich:
Object result = X.m(1, "hallo");
Wenn man nur Vererbung betrachten würde, dann könnte man auch eindeutig die spezi-
fi schste Klasse bestimmen, die zu beiden Parametern verträglich ist (im obigen Beispiel ist
das Object). Da in Java aber auch Implementierungsbeziehungen vorkommen, kann auch
eine Schnittstelle ein passender Typ sein. So kann als Rückgabetyp im obigen Beispiel die
Schnittstelle Serializable verwendet werden, weil sowohl Integer als auch String diese
Schnittstelle implementieren:
Serializable result = X.m(1, "hallo");
Im Allgemeinen kann es neben der spezifi schsten Klasse mehrere Schnittstellen geben, die
„am besten“ passen.
Die folgenden Codezeilen zeigen ein Beispiel dafür, dass die am besten passende Klasse
nicht Object sein muss:
class A {...}
class B extends A {...}
A a = X.m(new A(), new B());
Übrigens sind bei generischen Methoden auch Einschränkungen für die Typparameter
möglich:
class A {...}
class X
{
public static <T extends A> T m(T t1, T t2)
 
Search WWH ::




Custom Search