我有以下情况。为什么在给定场景的编译时允许将基类转换为扩展类?
public class Fruit {
public Fruit() {
System.out.println("Fruit Constructor");
}
public String callSuperApple() {
return "super fruit";
}
}
public class Apple extends Fruit{
private String color;
public String callSuperApple() {
return "super fruit";
}
}
还有一些第三类:
public class SomeClass{
private String color;
public String callSuperApple() {
return "fruit";
}
}
现在主要方法的实现:
public class MainClass{
public static void main(String[] args) {
Fruit fruit= new Fruit();
String string = (String)((Apple)fruit).callSuperApple();//line 3
System.out.println(string);
}
}
在这里,我们在运行时异常,但不是编译时错误。
但当线3被改变为
String string = (String)((SomeClass)fruit).callSuperApple();
它将引发一个编译时间错误。方法callSuperApple()
在SomeClass
和Fruit
中实施。
现在,Apple
是Fruit
的一种类型,但是我们能够反转类型转换fruit
到Apple
。 TypeCasting Apple
至Fruit
有意义,但不是相反。为什么在编译时允许这样做,并且SomeClass
仅在编译时捕获?
该方法已在SomeClass和Fruit中实现(尽可能),但仍有错误。请参阅编辑。谢谢 –
不能从水果投到SomeClass –
@NihalSharma我已经添加到我的答案。 – rgettman