在抽象類中,我有方法:Java泛型方法的傳承
abstract void method(Holder<?> holder);
和實現類(將有多個類像這樣的,每一個都有自己的類型 - SomeClass的,SomeClass2,..):
@Override
void method(Holder<SomeClass> aHolder) {...}
這不起作用,所以我失蹤了什麼?
有編譯器錯誤: 「方法無法從它的超重寫方法」
在抽象類中,我有方法:Java泛型方法的傳承
abstract void method(Holder<?> holder);
和實現類(將有多個類像這樣的,每一個都有自己的類型 - SomeClass的,SomeClass2,..):
@Override
void method(Holder<SomeClass> aHolder) {...}
這不起作用,所以我失蹤了什麼?
有編譯器錯誤: 「方法無法從它的超重寫方法」
的一點是,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) {}
}
你試圖用一個「更具體的」實施覆蓋如果不接受「?」,它只會接受「SomeClass」,因此它會打破與抽象類的「契約」。
它更容易理解,如果你想實現其他類,將與你的類交互。
你希望它接受任何類類型,因爲它宣稱「?」,但如果只接受「SomeClass的」它會破壞你的系統。
你應該在類級別使用通用的「T」代替,並宣佈你正在使用的每個執行的類型。
什麼是確切的錯誤? –
要覆蓋addDocs(),而不是()方法 –
對不起,我就來修正一下...... 「方法」是實際重寫, 的一個但這不是問題 – Dejan