2014-04-03 30 views
0

我有以下情況。爲什麼在給定場景的編譯時允許將基類轉換爲擴展類?

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()SomeClassFruit中實施。

現在,AppleFruit的一種類型,但是我們能夠反轉類型轉換fruitApple。 TypeCasting AppleFruit有意義,但不是相反。爲什麼在編譯時允許這樣做,並且SomeClass僅在編譯時捕獲?

回答

0

鑄件始終是允許的。你基本上是在告訴編譯器它確實是這個類型。在運行時,JVM仍會在ClassCastException上捕獲錯誤。

但是,編譯器錯誤是因爲SomeClass類中沒有callSuperApple方法。演員陣容是允許的,但是這個消息是在你演奏的課程中不存在的方法fruit - SomeClass

加成

如今,隨着問題的變化,有一個callSuperApple方法SomeClass。現在,編譯器錯誤是error: inconvertible types,因爲編譯器知道兩個類都不能轉換爲另一個類,因爲兩個類都不是另一個的超類,直接或間接。 A SomeClass不是Fruit,並且Fruit不是SomeClass

你會得到同樣的錯誤有:

Number n2 = (Number) "blah"; 

,因爲無論NumberString不是彼此的父。

+0

該方法已在SomeClass和Fruit中實現(儘可能),但仍有錯誤。請參閱編輯。謝謝 –

+0

不能從水果投到SomeClass –

+0

@NihalSharma我已經添加到我的答案。 – rgettman

相關問題