假设我有A,B和C三个班级。

C延伸B,B延伸A。
一个实现接口InterfaceA
B实现接口InterfaceB1和InterfaceB2。

找到所有可能的向下转换组合的最佳方法是什么?

我的意思是?

假设我们有:
B b =新的B();
接口A i =(接口A)(A)(B)b。

我们如何才能容易地知道它是否可以编译以及是否会在没有IDE的情况下导致classcastException?

我知道对象和引用是如何工作的,并且对Java中的多态性有相当的了解。

我开始绘制类和接口结构的草图。

编辑:我知道我的例子是不正确的,但是当接口加入故事时,我总是很挣扎。

最佳答案

首先让我们处理“是否编译”。

确定这一点的关键是查看编译时类型,即变量的声明类型。

通常,


从编译时接口类型强制转换为接口类型总是会编译。
如果满足以下任一条件,则仅从编译时接口类型强制转换为类:


班级是非决赛
该类实现接口

如果满足以下任一条件,则仅从编译时类类型转换为接口类型:


班级是非决赛
该类实现接口

从编译时类类型转换为另一类类型的方法只有在其中一个继承自另一个类的情况下才进行编译。


为了确定转换是否在运行时成功,关键是查看存储在变量中的对象的运行时类型。例如:

A a = new B();


a的编译时间类型为A,但是运行时类型为B

通常,只有当T继承自U或实现T时,才能从运行时类类型U强制转换为类或接口类型U



对于未来的读者,

相反,如果您想知道如何使用代码检查强制类型转换是否成功,则应参考此question

关于java - 如何查看向下转换在Java中是否合法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54276592/

10-11 23:03
查看更多