EIDI-Crashkurs 2020 › Crashkurs-Aufgaben zu Polymorphie › Antwort auf: Crashkurs-Aufgaben zu Polymorphie
Der Aufruf 8 kommt ja irgendwann zu e.g(f)
. Der statische Typ von e
ist hier jedoch nicht F
sondern E
. Grund dafür ist Type Erasure, weil der Aufruf innerhalb von C<?>
stattfindet. Der Compiler weiß nicht, dass wir hier fix in C<F>
sind (wir könnten irgendwann ja auch mal in C<D>
sein). Der statische Typ muss für einen bestimmten Kontext aber immer fix sein. Deshalb wird für e
der allgemeinste mögliche Typ genommen und das ist E
(wegen C<R extends E>
). Dann suchen wir g(F)
in E
, finden dort g(E)
und überschreiben es anschließend in F
.
Das Attribut bestimmten wir immer über den statischen Typ, also den Typ der Variable, von der wir auf ein Attribut zugreifen bzw. von der Klasse, in der wir uns befinden. Bei d.e
ist der statische Typ von d
bspw. D
(dynamisch F
), also wollen wir im F
-Objekt die Variable e
. Dort gibt es zwei, weil F
das e
Attribut aus D
und A
erbt. Wir wählen das aus D
geerbte e
, weil der statische Typ von d
D
ist, also besteht nur Zugriff auf die Variablen aus D
und Oberklassen von D
.