我有三个类:A
,AA
和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/