Ihre Klassenhierarchie sieht wie folgt aus:
![C -> B -> A -> I](https://i.stack.imgur.com/YRTnX.png)
Objekt x
kann Y
Klasse gegossen werden, wenn Laufzeittyp von x
Unterklasse von Y
ist. Oder mit anderen Worten, wenn ein Pfad vom Laufzeittyp x
zu Y
existiert. Mit "Laufzeittyp" meine ich den Typ des Objekts (dasjenige, das beim Konstruieren des Objekts verwendet wird) im Gegensatz zum Typ der Variablen (der aus der Variablendeklaration).
Dies gilt:
b = new B();
(B)(I)b;
Objekt hat B
Typ in b
gespeichert. Es wird zu I
und dann zurück zu B
geworfen. B
ist eine Unterklasse von beiden. Cast to I
tut eigentlich nichts und soll Sie nur verwirren. keiner von denen
jedoch gilt:
a = new A();
(B)(I)a;
(B)a;
Sie werden beide scheitern mit Ausnahme: java.lang.ClassCastException: A cannot be cast to B
. a
hat den Typ A
, der keine Unterklasse von B
ist. Es gibt eine Beziehung zwischen A
und B
, aber es ist in die entgegengesetzte Richtung - B
ist eine Unterklasse von A
.
Weitere Erläuterungen finden Sie hier: http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
Warum Sie 'I' werfen überhaupt? Wenn Sie alle Erwähnung von "I" entfernt haben und nur "a = (B) b;" und "b = (B) a" hatten, wäre Ihnen das klar? –
@JonSkeet dies ist eine Java-Prüfung Frage ich bin auch sehr verwirrt, warum sie ein Interface "I" – OPK
Gießen Beide dieser Modelle sind korrekt (wie sie beide kompilieren und nicht zur Laufzeit fehlschlagen). Was genau sehen Sie, dass sie nicht in Java 7+ kompilieren? – Makoto