java – 以我们转换基元数据类型的方式转换对象

我有三个班:A,AA和Top. A和AA延伸顶部.

为什么这不会编译:

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方法,但是aa具有动态类型A,这意味着变量aa引用的实际对象没有名为bar的方法(“hi!”).

(对象的静态类型告诉您可以在其上调用哪些方法,动态类型告诉您它实际具有哪些方法.)

所以Java会告诉aa做bar(“hi!”)但是aa不知道该怎么做,因为aa没有定义bar方法.

点赞