Antwort auf: Generische Klassen Aufgabe 73 Aufrufe 8,17,21

EIDI-Crashkurs 2020 Generische Klassen Aufgabe 73 Aufrufe 8,17,21 Antwort auf: Generische Klassen Aufgabe 73 Aufrufe 8,17,21

#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 erbt X<A> von X<C> noch umgekehrt. Die Klassen haben genauso wenig miteinander zu tun wie String und Stack – gar nichts. Dass die generischen Typen in einer Vererbungshierarchie stehen ist schön, tut aber nichts zur Sache – X<A> erbt von Object, X<C> erbt von Object.
  • q) class Q<T> extends X<T> {}  kompiliert nicht, weil der Typparameter von Q (also T) nicht eingeschränkt ist, d. h. über T ist lediglich bekannt, dass es mindestens Object sein muss. Die Oberklasse X verlangt aber einen generischen Typ, der mindestens A ist (<T extends A>).
  • u) class U<K extends A> extends X<D> {}; definiert zunächst eine Unterklasse von X<D>, d. h. bspw. es gibt die Klasse U<A>, die von X<D> erbt; es gibt die Klasse U<B>, die von X<D> erbt; es gibt die Klasse U<C>, die von X<D> erbt; und es gibt die Klasse U<D>, die von X<D> erbt. Dass hier der Typparameter nicht durchgegeben wird ist okay – muss man ja nicht.
    Das Problem liegt bei X<B> u = new U<B>();, denn U<B> ist keine Unterklasse von X<B>, also kompiliert es nicht. U<B> erbt von X<D>, nicht von X<B>.