我有以下情況。爲什麼在給定場景的編譯時允許將基類轉換爲擴展類?
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