首页 > 解决方案 > 尝试强制转换子类时出现 ClassCastException

问题描述

我有这个代码:

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();

谢谢!

标签: javacasting

解决方案


您正在创建一个类型为 的对象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.

推荐阅读