Java 中的多重转换

Multiple casting in Java

提问人:Syed Noman Ahmed 提问时间:6/14/2022 更新时间:6/14/2022 访问量:101

问:

我知道一些关于Java如何执行强制转换的规则,但我无法弄清楚以下示例中的规则:

interface I {}
class A implements I {}
class B extends A {}
class C extends B {}

class DriverClass {
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();

        a = (A)(B)(C)c;   // line 1 - Valid
        a = (A)(C)(B)c;   // line 2 - Valid
        a = (B)(A)(C)c;   // line 3 - Valid
        a = (B)(C)(A)b;   // line 4 - Runtime error
        a = (C)(B)(A)b;   // line 5 - Runtime error
        a = (C)b;         // line 6 - Runtime error
    }
}

有人可以解释为什么第 1 行到第 3 行是有效语句,而第 4 行到第 6 行会抛出 ClassCastException 的运行时错误吗?

Java 继承 接口 转换

评论

7赞 Stephen C 6/14/2022
答:因为 C 实例是 B,但 B 实例不是 C.(如果类 A、B 和 C 有一些字段,那么 B 实例不能是 C 就很明显了。

答:

4赞 Dawood ibn Kareem 6/14/2022 #1

你的类声明说每个 C 都是 B,每个 B(包括 C)都是 A。

现在你引用了一个新的 C,所以它也是一个 B 和一个 A。这意味着您可以按任何顺序强制转换为三个类中的任何一个,并且不会出现错误。cc

然后你引用一个新的 B,那不是 C。这意味着您可以毫无问题地将其转换为 A 或 B,但是一旦您尝试转换为 C,就会出现错误,因为引用的对象不是 C。bbb

评论

0赞 Syed Noman Ahmed 6/14/2022
谢谢达伍德。这个解释很有道理。