2016-03-01 81 views
4

我是一名Java初學者,在學習過程中遇到此程序。無法在子類中創建返回類型對象的方法

一級是超級班。第二類延伸一,三延伸二。

class One { 
public One foo() { 
return this; 
} 
} 
class Two extends One { 
    public One foo() { 
    return this; 
    } 
} 
class Three extends Two { 
    public Two foo() { 
    return this; 
    } 
} 

在這裏,在第三類,當我創建返回類型二的方法foo沒有編譯錯誤但是當我做如下圖所示的返回類型「對象」,有一個編譯錯誤。

class Three extends Two { 
    public Object foo() { 
    return this; 
    } 
} 

從我到目前爲止瞭解到的情況來看,Object是所有類的超類。爲什麼我不能在子類中創建返回類型爲「Object」的方法?

回答

4

它失敗了,因爲返回的類應該是One或其子類(例如Two),它也保證也是One;不是它的超類(例如Object),就編譯器而言,它可以是除One之外的其他任何東西。

class Three extends Two { 
    public Two foo() { // works because Two is a subclass of One 
    return this; 
    } 
} 

class Three extends Two { 
    public Object foo() { // fails because Object is not a subclass of One 
    return this; 
    } 
} 
0

如果你有一個想法有關共同的變體光盤return typeOverriding念來過,那麼你必須知道,在孩子class壓倒一切的方法必須return這樣一種類型,或者是爲同super類方法包含或任何child Class(協變類類型)。 Co-Variant Return Type Example

class Three extends Two { 
    public Object foo() { 
    return this; 
    } 
} 

注: - 在此代碼你返回object類。這是一個super所有類不是兒童所以它的一種非法編譯代碼。

你可以試試這個...

class Three extends Two { 
    public Two foo() { // works because Two is a subclass of One 
    return this; 
    } 
} 

OR

class Three extends Two { 
     public Three foo() { // works because Three is a subclass of Two & One 
     return this; 
     } 
    } 

兩者都可以勝任。根據您的需要使用。謝謝

+0

爲什麼你回滾我所做的編輯?重新引入拼寫錯誤,格式不正確,噪音等?你知道Stack Overflow是如何工作的,對嗎?鼓勵每個人都改進帖子? –