EIDI-Crashkurs 2020 › Generische Klassen Aufgabe 73 Aufrufe 8,17,21 › Antwort auf: Generische Klassen Aufgabe 73 Aufrufe 8,17,21
18.02.2020 um 11:45 Uhr
#3439
- h)
X<A> h = new X<C>();
kompiliert nicht, weil der Typ der Variable (X<A>
) nichts mit dem Typ des Objekts (X<C>
) zu tun hat, d. h. weder erbtX<A>
vonX<C>
noch umgekehrt. Die Klassen haben genauso wenig miteinander zu tun wieString
undStack
– gar nichts. Dass die generischen Typen in einer Vererbungshierarchie stehen ist schön, tut aber nichts zur Sache –X<A>
erbt vonObject
,X<C>
erbt vonObject
. - q) class
Q<T> extends X<T> {}
kompiliert nicht, weil der Typparameter vonQ
(alsoT
) nicht eingeschränkt ist, d. h. überT
ist lediglich bekannt, dass es mindestensObject
sein muss. Die OberklasseX
verlangt aber einen generischen Typ, der mindestensA
ist (<T extends A>
). - u)
class U<K extends A> extends X<D> {};
definiert zunächst eine Unterklasse vonX<D>
, d. h. bspw. es gibt die KlasseU<A>
, die vonX<D>
erbt; es gibt die KlasseU<B>
, die vonX<D>
erbt; es gibt die KlasseU<C>
, die vonX<D>
erbt; und es gibt die KlasseU<D>
, die vonX<D>
erbt. Dass hier der Typparameter nicht durchgegeben wird ist okay – muss man ja nicht.
Das Problem liegt beiX<B> u = new U<B>();
, dennU<B>
ist keine Unterklasse vonX<B>
, also kompiliert es nicht.U<B>
erbt vonX<D>
, nicht vonX<B>
.