Наследование Java пониженное ClassCastException

учитывая следующий код, у меня есть вопрос:

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
    }
}

Мой вопрос с жирным шрифтом. Насколько я понимаю, для того, чтобы код компилировался, просто нужно убедиться, что классы находятся в одной и той же иерархии и в результате это может работать (вверх по дереву неявное приведение, вниз по дереву требуется явное приведение). Всякий раз, когда я сталкиваюсь с ClassCastException, это происходит потому, что ссылка указывала на объект вверх по дереву, например. ссылка типа B, указывающая на объект типа A.

Похоже, что рассматриваемая строка является ссылкой типа A, указывающей на объект типа A. Очевидно, приведение к (B) является причиной ClassCastException. Может кто-нибудь объяснить, пожалуйста, что это делает для этого?

Примечание. Если a1 указывает на объект типа B, он работает (только что проверил). Таким образом, обратное утверждение является законным в отношении компилятора, и его можно выполнить без исключения, если ссылка указывает на объект правильного типа.

При приведении A ref a1 к B и присвоении его a, получается, что A ref a больше не ожидает ссылки на объект типа A, а на B?

Спасибо, Шон.

PS Я знаю, что это немного необычно, подготовка к сертификации Java. Обычно мы опускаемся до типа с левой стороны, например б = (В); (и я могу понять, почему это дает исключение ClassCastException).

Ответы на вопрос(5)

Ваш ответ на вопрос