hierarchii klasy wygląda następująco:
Object x
można rzutować klasy Y
, jeśli rodzaj runtime x
jest podklasą Y
. Lub, innymi słowy, jeśli istnieje ścieżka od typu środowiska wykonawczego x
do Y
. Przez "typ środowiska wykonawczego" rozumiem typ obiektu (używany podczas konstruowania obiektu) w przeciwieństwie do typu zmiennej (tej z deklaracji zmiennej).
To jest ważne:
b = new B();
(B)(I)b;
obiektu przechowywane w b
ma typ B
. Został przesłany do I
, a następnie z powrotem do B
. B
jest podklasą obu nich. Przesyłanie do wersji I
w rzeczywistości nic nie robi i służy jedynie dezorientacji.
Jednak żaden z nich jest ważny:
a = new A();
(B)(I)a;
(B)a;
Będą zarówno niepowodzeniem z wyjątkiem: java.lang.ClassCastException: A cannot be cast to B
. a
ma typ A
, który nie jest podklasą B
. Istnieje relacja między A
i B
, ale jest w przeciwnym kierunku - B
jest podklasą A
.
celu uzyskania bardziej szczegółowych wyjaśnień zobaczyć tutaj: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Czemu odlewania do 'I' w ogóle? Jeśli usunąłeś całą wzmiankę o 'I' i po prostu miałeś' a = (B) b; 'i' b = (B) a "byłoby to dla ciebie jasne? –
@JonSkeet to pytanie egzaminacyjne java Jestem również bardzo zdezorientowany, dlaczego rzucanie interfejsu "I" – OPK
Oba te są prawidłowe (jak w obu kompilacji i nie zawiedzie w czasie wykonywania). Co konkretnie widzisz, co sprawia, że nie są one kompilowane w Java 7+? – Makoto