我有三个班: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方法.