Java类/对象转换何时适用

时间:2016-05-22 02:52:09

标签: java object casting

我对通过类进行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以及它是如何被允许的,但是我觉得课堂演员仍然是一个让我感到困惑的概念。

2 个答案:

答案 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;

我认为我没有在这里进一步困惑你。