gpt4 book ai didi

java - 显式转换背后的逻辑

转载 作者:行者123 更新时间:2023-11-30 04:38:29 24 4
gpt4 key购买 nike

考虑 Java 中的以下类:

interface I{
}
class A implements I{
}

class B extends A {
}

class C extends B{
}
And the following declarations:
A a = new A();
B b = new B();

一旦有了a = (B)(I) b;,代码就会编译并运行。而且完全不明白为什么我需要转换为 Interface 和 B 类。在我看来,当 a = b; 没问题时,它会起作用。有人可以向我解释一下上述显式转换的逻辑是什么使代码运行良好吗?

但是一旦有了 I i = (C) a; 它将在运行时失败,因为“a”不指向类 C 的对象。为什么“a”需要指向指向C类的对象?除此之外,我不明白转换为 C 类的逻辑。无论如何,你都会有 I 接口(interface)的引用。最好的问候

最佳答案

只有当转换的对象确实扩展了此类或实现了此接口(interface)时,才可以将对象转换为给定的类或接口(interface)。如果不是(即,如果该对象不是类或接口(interface)的实例),您将得到 ClassCastException。请注意,将对象转换为类不会更改对象的类型。它只允许将其引用为另一种类型,它也是扩展或实现的类型。

让我们看看您的示例:

a = (B)(I) b;

这首先会转换对象 b,其类型为 B。到接口(interface)I。这是可以的,因为 B 扩展了 A,并且 A 实现了 I,这意味着 B 也实现了 I。

然后它再次将同一个对象转换为类BbB 的实例,因此这是有效的。

I i = (C) a;

这会将类型为 A 的对象 a 转换为类 C。 A 不扩展 C,所以这是不可能的。

关于java - 显式转换背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12857964/

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