Java-Vererbungs-Downcast ClassCastException

Mit dem folgenden Code habe ich eine Frage:

class A{}
class B extends A {}
class C extends B{}

public class Test {
    public static void main(String[] args) {
        A a = new A();
        A a1=new A();
        B b = new B();
//        a=b;// ok
//        b=(B)a;// ClassCastException
//        a=(A)a1;  // ok
//        a=a1;  // ok

        a=(B)a1;  // compiles ok, ClassCastException
    }
}

Meine Frage ist mit der Zeile in Fettdruck. Mein Verständnis ist, dass für das Kompilieren des Codes nur sichergestellt sein muss, dass sich die Klassen in derselben Hierarchie befinden, und dass dies möglicherweise funktioniert (für das implizite Umwandeln des Baums und für das Umwandeln des Baums ist explizites Umwandeln erforderlich). Wann immer ich auf ClassCastException gestoßen bin, lag es daran, dass die Referenz auf ein Objekt in der Baumstruktur zeigte, z. ein Verweis vom Typ B, der auf ein Objekt vom Typ A zeigt.

Die fragliche Zeile scheint ein Verweis vom Typ A zu sein, der auf ein Objekt vom Typ A zeigt. Die Umwandlung in (B) ist offensichtlich die Ursache für die ClassCastException. Kann jemand bitte erklären, was es tut, um dieses zu bewirken?

Hinweis: Wenn a1 auf ein Objekt vom Typ B zeigt, funktioniert es (es wurde nur getestet). Der Downcast ist also in Bezug auf den Compiler legal und kann ausnahmslos ausgeführt werden, wenn die Referenz auf ein Objekt des richtigen Typs verweist.

Wenn Sie die A-Referenz a1 in ein B umwandeln und sie einem A zuweisen, scheint es, dass die A-Referenz a nicht mehr erwartet, auf ein Objekt vom Typ A zu verweisen, sondern auf ein B?

Danke, Sean.

PS Ich weiß, das ist ein bisschen ungewöhnlich, Vorbereitung auf die Java-Zertifizierung. Normalerweise stürzen wir auf den Typ auf der linken Seite, z. b = (B) a; (und ich kann sehen, warum dies eine ClassCastException gibt).

Antworten auf die Frage(5)

Ihre Antwort auf die Frage