我有三个类:AAA和Top。 A和AA扩展了Top。

为什么它不能编译:

A a = new A();
AA aa = (AA)a;

但这将:
float f = 4.3f;
int i = (int) f;

最佳答案

A类和AA类在同一层次结构中,但它们是并排的,因此不能将它们彼此转换。

可以说A类的定义如下:

public class A extends Top{

   public A() {

   }

   public void foo(int i) {
      System.out.println(i);
   }

}

该类AA的定义如下:
public class AA extends Top {

   public AA() {

   }

   public void bar(String s) {

   }

}

现在让我们从理论上想象一下,如果您尝试将A转换为AA并能正常工作,将会发生什么:
A a = new A();
(AA) aa = (AA) a;

由于aa具有AA静态类型,因此Java将允许您编写如下代码:
aa.bar("hi!");

由于AA类具有bar方法,因此BUT aa具有A动态类型,这意味着变量aa引用的实际对象没有称为bar("hi!")的方法。

(对象的静态类型告诉您可以调用的方法,而动态类型告诉您对象实际具有的方法。)

因此,Java会告诉aa进行bar("hi!"),但是aa不知道要做什么,因为aa没有定义bar方法。

关于java - 以我们转换原始数据类型的方式转换对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43433626/

10-13 09:42