2013-07-09 41 views
4

下編譯沒有任何問題重寫和返回類型的兼容性

boolean flag = true; 
Boolean flagObj = flag; 

現在成像以下情形

interface ITest{ 

    Boolean getStatus(); 

} 

class TestImpl implements ITest{ 

    public boolean getStatus(){ // Compile error: return type is incompatible 
     return true; 
    } 
} 

我的問題是關於在提及行的編譯錯誤。我提到的接口返回類型爲Boolean,但實現的方法返回boolean字面

我的問題是,如果Booleanboolean是兼容的,則編譯器爲什麼抱怨?自動裝箱不適用於此嗎?

+3

嗯,不,它們不是「兼容」的。一個是對象,另一個是原始類型。 Auto {un,}裝箱是一回事,方法原型是另一回事;) – fge

+1

是的,所以答案是語言被定義爲這樣,這不是編譯器中的錯誤。同樣,你不能使用'int'來覆蓋'long'。我的意思是,能夠實現'void'返回方法的'Void'方法會很好,但是你不能。 –

回答

5

您只能返回父級返回類型的子類。

編譯可以讓你在原語和包裝器之間自動裝箱和取消裝箱,但是這不會使其中一個成爲另一個的子類。基元不是類,不能按照你的建議使用。

我只想擁有的getStatus()返回Boolean或讓父母回boolean

從理論上講,自動裝箱可以擴大到允許你有什麼建議,但我無法想象多大用處吧。

從理論上講,你也可以在編譯器支持隱向上轉型寫這

class A { 
    int method() { ... } 
} 

class B extends A { 
    short method() { .... } 
} 

。但是,我懷疑這也沒有多大用處。

+0

謝謝彼得。我在無意中遇到了這個問題,而這正是我在編譯器標記錯誤之前認爲的(_auto-boxing可能會被延長)。 – Santosh

+1

@Santosh Java往往是一種「功能差」的語言,只添加你真正需要的東西(有時候添加任何東西的速度非常緩慢)。另一方面,大多數功能都很少被邊緣案例所理解(仍然有很多即使如此) –

0

這些方法在原型和實現上有不同的簽名。基元不是類,不能繼承原型的Boolean。即使使用自動裝箱,實施也違反了通用原型。

if(getStatus()) doSomething(); 
+0

哎唷,從來沒有創建一個新的布爾值,甚至建議它。只有兩個可能的值,並且自從添加了自動裝箱之後,它們就被緩存了。 BTW愛Interrobang。 –

+0

@PeterLawrey主要是爲了強調未來讀者的說明性效果,但我刪除了它。 – hexafraction

+1

您可以編寫'Boolean.valueOf(true)'或'Boolean.TRUE'您會驚訝地發現有多少商業產品調用'new Boolean'這是我的寵兒。 –

0

我們知道,我們只能返回:返回作爲後

public Boolean getStatus(){ // Compile error: return type is incompatible 
    return Boolean.TRUE; 
} 

它可以拆箱:自動拆箱是返回後執行所以如果的getStatus開始實施,像這樣父類的返回類型的一個子類.Here布爾類型是包裝類,而布爾類型是基本數據類型。總之,兩者都不同於包裝類和原始類型。所以它給出了不兼容的錯誤。