ClassCastException при попытке привести подкласс - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть этот код:

package Maven_test.Maven_project_test;

public class Test {
    class A {
        int i = 10;
    }

    class B extends A {
        int j = 20;
    }

    class C extends B {
        int k = 30;
    }

    public void pruebaJerarquia() {
        A a = new B();
        B b = (B) a;
        C c = (C) b;

        System.out.println(c.k);
    }
}

, и я хотел бы знать, почему эта строка:

C c = (C) b;

выдает это исключение при выполнении программы:

Exception in thread "main" java.lang.ClassCastException: 
Maven_test.Maven_project_test.Test$B cannot be cast to 
Maven_test.Maven_project_test.Test$C
    at Maven_test.Maven_project_test.Test.pruebaJerarquia(Test.java:21)
    at Maven_test.Maven_project_test.App.main(App.java:10)

Я думаю, что это как-то связано с апскейтингом и спадом, но я не понимаю.Может быть, потому, что «b» указывает на «a», а «C c = (C) b» - это все равно что пытаться разыграть что-то подобное?

C c = new A();

Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Поскольку теоретически B может быть C, но не всегда C.

B b = new C ();

Нисходящее приведение не является хорошей идеей.Лучше включать чек каждый раз, когда вы разыгрываете.

if ( b instanceof C) {
    C c = (C) b;
}
0 голосов
/ 11 декабря 2018

Вы создаете один объект типа B.Согласно вашей иерархии классов, каждый B объект также является A, но не C.

. Теперь давайте посмотрим, как назначить ссылку на этот B объект различным переменным:

Object o = new B(); // You can always assign references to an Object-typed variable.
A a = (A) o; // This works because the object is of type A.
B b = (B) o; // This works because the object is of type B.
C c = (C) o; // This does not work because the object is not of type C.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...