小编典典

将已知类型的引用强制转换为类型层次结构外部的接口

java

假设您有一个像这样的干净班级:

public class A {
    // Stuff
}

和这样的接口:

public interface G {
    // Stuff
}

为什么我可以这样做:

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

我不明白为什么当彼此无关时,应该可以从类A转换为接口G。有人可以向我解释一下吗?


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

public class C implements G {
    // Stuff
}

这不会编译:

((C) a)

实现接口的类与仅实现接口的类有什么区别?

编辑:我得到一个编译器错误说:

无法从A投射到C


阅读 214

收藏
2020-11-26

共1个答案

小编典典

强制转换意味着您比编译器更了解有效内容。您正在告诉编译器关闭并按照您的指导进行操作。在某些情况下,编译器可以告诉您强制类型转换无效,但是很容易愚弄。

大多数转换通常是从Object到其他对象的,例如从非通用集合中获取对象或使用PortableRemoteObject.narrow获取远程对象时。这些强制类型转换始终会进行编译,因为强制类型转换(只要是对象而不是原始类型)始终是对象的有效子类。

参考类型转换(5.5.1)部分中的Java语言规范中有一些转换规则。如果编译器可以确定这些类之间没有关系(编译器可以告诉这些类是不同的,并且它们都不是另一个的子类),则它将拒绝强制类型转换。

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

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

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

2020-11-26