2016-04-26 27 views
0

在抽象類中,我有方法:Java泛型方法的傳承

abstract void method(Holder<?> holder); 

和實現類(將有多個類像這樣的,每一個都有自己的類型 - SomeClass的,SomeClass2,..):

@Override 
void method(Holder<SomeClass> aHolder) {...} 

這不起作用,所以我失蹤了什麼?

有編譯器錯誤: 「方法無法從它的超重寫方法」

+0

什麼是確切的錯誤? –

+0

要覆蓋addDocs(),而不是()方法 –

+0

對不起,我就來修正一下...... 「方法」是實際重寫, 的一個但這不是問題 – Dejan

回答

3

的一點是,void method(Holder<?> holder)需求的實現,能夠接受任何的:Holder<SomeClass>Holder<SomeClass2>Holder<Void>

如果你試圖聲明一種方法,在子類void method(Holder<SomeClass> holder),這意味着你可以調用持有者(如SomeClass value = holder.get())提供的方法,但如果參數實際上Holder<Void>類型的是,例如,將失敗的一類強制轉換異常。

因此,它是由型系統禁止的。

你必須在類級別類型變量:

abstract class BaseClass<T> { 
    abstract void method(Holder<T> aHolder); 
} 

然後你就可以創建具體的類:

class SomeClassBaseClass extends BaseClass<SomeClass> { 
    @Override void method(Holder<SomeClass> aHolder) {} 
} 
1

你試圖用一個「更具體的」實施覆蓋如果不接受「?」,它只會接受「SomeClass」,因此它會打破與抽象類的「契約」。

它更容易理解,如果你想實現其他類,將與你的類交互。
你希望它接受任何類類型,因爲它宣稱「?」,但如果只接受「SomeClass的」它會破壞你的系統。

你應該在類級別使用通用的「T」代替,並宣佈你正在使用的每個執行的類型。