- Dieses Thema hat 1 Antwort und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 5 Jahren, 9 Monaten von .
Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
Ansicht von 2 Beiträgen - 1 bis 2 (von insgesamt 2)
EIDI-Crashkurs 2020 › Generische Klassen Aufgabe 73 Aufrufe 8,17,21
Guten Morgen Stefan,
vielen Dank für deine letzte ausführiche und schnelle Antwort, ich hätte noch eine zu der Aufgabe 73 im Skript.
1. Wieso kompiliert hier der Aufuf 8 –> X h = new X <C> (); nicht?
2. Wieso kompiliert der Aufruf 17 –> class Q < T> extends X <T> {}; nicht?
3. Wieso kompiliert der Aufruf 21 –> class U <K extends A > extends X<D> { }; X u = new U();
Danke schonmal im Vorraus!!!
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<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>).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.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>.