gpt4 book ai didi

java - 将已知类型的引用转换为类型层次结构之外的接口(interface)

转载 作者:搜寻专家 更新时间:2023-11-01 04:06:12 26 4
gpt4 key购买 nike

假设你有一个像这样干净的类:

public class A {
// Stuff
}

像这样的界面:

public interface G {
// Stuff
}

为什么允许我这样做:

A a = new A();
((G) a) // No errors thrown

我不明白为什么在它们彼此无关的情况下可以从类 A 转换为接口(interface) G。有人可以给我解释一下吗?


跟进。如果我执行以下操作:

public class C implements G {
// Stuff
}

这不会编译:

((C) a)

实现接口(interface)的类和只实现接口(interface)的类有什么区别?

编辑:我收到一条编译器错误消息:

Cannot cast from A to C

最佳答案

转换意味着您比编译器更了解什么是有效的。您是在告诉编译器闭嘴并听从您的领导。编译器可以在少数情况下判断强制转换无效,但很容易被愚弄。

大多数类型转换往往是从 Object 到其他对象,例如从非泛型集合中获取对象或使用 PortableRemoteObject.narrow 获取远程对象时。这些强制转换总是可以编译的,因为无论您强制转换为什么(只要它是一个对象,而不是原始类型)总是对象的有效子类。

Reference Type casting (5.5.1) 部分的Java 语言规范中有一些转换规则。 .如果编译器可以确定类之间没有关系(编译器可以分辨出类是不同的,并且都不是另一个的子类),那么它将拒绝转换。

添加的示例很有趣,它失败了,因为编译器有足够的信息表明强制转换无效。如果将代码更改为:

    A a = new A();
G g = (G)a;
Object o = a;
C c = (C)o;

然后它再次编译正常(即使它是错误的)。

关于java - 将已知类型的引用转换为类型层次结构之外的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16347252/

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