2015-01-03 1 views
5

wenn:Casting in Java (Schnittstelle und Klasse)

interface I{} 

class A implements I{} 

class B extends A{} 

class C extends B{} 

A a = new A(); 
B b = new B(); 

Why a = (B)(I)b; is correct 
but b = (B)(I)a; is false? 

Ich finde Gießen sehr verwirrend sein, was ist der beste Weg, wenn ich Guss kann bis zu verstehen oder aufschütten ein Objekt?

+4

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? –

+0

@JonSkeet dies ist eine Java-Prüfung Frage ich bin auch sehr verwirrt, warum sie ein Interface "I" – OPK

+0

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

Antwort

1

Ihre Klassenhierarchie sieht wie folgt aus:

C -> B -> A -> I

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

1

Das einzige, was von Bedeutung ist, die Frage in Ihrer Codierung Probe zu beantworten ist die folgende:

class B extends A{} 

Dies bedeutet, dass B eine Unterklasse von A. Unterklassen können in Superklasse-Typen umgewandelt werden, aber die Superklasse kann nicht in Unterklasse-Typen umgewandelt werden.

Daher A kann nicht auf den Typ B. gegossen werden

Warum? Denken Sie an die Logik auf diese Weise:

enter image description here eine Art von Programming_language, aber Programming_language ist nicht eine Art von enter image description here