gpt4 book ai didi

Java 继承向下转型 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 06:01:42 24 4
gpt4 key购买 nike

鉴于以下代码,我有一个问题:

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 的 ref 指向类型 A 的对象。

有问题的行似乎是类型 A 的引用,指向类型 A 的对象。显然,转换为 (B) 是导致 ClassCastException 的原因。有人可以解释一下它的作用是什么吗?

注意:如果 a1 指向类型为 B 的对象,那么它可以工作(只是对其进行了测试)。因此,向下转换对于编译器是合法的,如果引用指向正确类型的对象,它可以毫无异常(exception)地执行。

通过将 A ref a1 强制转换为 B 并将其分配给 a,看来 A ref a 不再期望引用类型为 A 的对象而是 B?

谢谢,
肖恩。

PS我知道这有点不寻常,准备Java认证。通常我们向下转换到左侧的类型,例如b=(B)a; (我可以理解为什么这会产生 ClassCastException)。

最佳答案

通过继承,所有 B 都是 A。但并非所有 A 都是 B。这个特定的实例不是,因此运行时异常。

关于Java 继承向下转型 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21612365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com