我对通过类进行Java转换有一个广泛的问题。假设我创建了4个类(3个类和1个接口),接口A是超级接口,我想你可以说,B类实现A(意味着它是接口A的子类),C扩展B然后D延伸C.
假设我有一个驱动程序类,我在其中初始化如下所示:
A myA;
B myB = new B();
C myC = new C();
D myD = new D();
//I want to cast now!
myB = (B) myD;
myC = (D) myA;
myD = (C) myB;
这些制造物何时实际可编辑?我在理解铸造之间的规则时遇到了一些困难。我有点理解Down-casting以及它是如何被允许的,但是我觉得课堂演员仍然是一个让我感到困惑的概念。
答案 0 :(得分:2)
拇指规则是如果对象B是A类型,那么它可以被转换为A.在你的例子中,B实现了A,所以B是A类型。你可以将任何B对象转换为A. B,C是B类型和A类型。因此C对象可以转换为A或B.
答案 1 :(得分:0)
想要添加评论,但因为限制,必须将其添加为答案:
1)规则是Child可以继承父/父有什么,但不能反转。 2)孩子可以作为父母存储,但不能反向。
这使myD =(C)myAB;因为myD扩展C(扩展B - > A)而无法编译
所以当你创建
B myB = new B();
如果我尝试用非技术术语解释,那么myB知道关于B和A的一切,但它不知道下面是什么。它可以在以下层次结构中查看并标识其上方的任何内容:
A
B
C
D
所以最低的一个D可以被投射到位于其上方的任何东西。
1)myB =(B)myD;
使用上面的规则状态,D低于B,因此可以分配给B.
2)myC =(D)myA; 在这里你有一个到D的接口,因此在编译时,D可以被分配到顶级C。
3)这里myB(在该语句中在编译时被编译为C)在编译时不能被分配给D(尽管它是层次结构中较低的D的实例)但是在编译时,你没有运行时实例可用。所以下面会失败:
myD =(C)myB;
我认为我没有在这里进一步困惑你。