[英]Java generics overriding method
我是使用泛型的新手(我很晚才參加聚會),並且不確定我要實現的目標是否可行,如果可以,如何實現。
好的,這是我試圖實現的一個人為的示例,希望可以顯示出沒有任何混亂的模式:
// Pet and Cats
interface Pet { }
interface Cat extends Pet { }
class TabbyCat implements Cat { }
// Pet food and cat food
interface PetFood<T extends Pet> { }
interface CatFood extends PetFood<Cat> {}
class DryCatFood implements CatFood {}
class WetCatFood implements CatFood {}
// PetBowl
interface PetBowl<T extends Pet> {
public void addFood(PetFood<T> food);
}
// CatBowl
class CatBowl implements PetBowl<Cat> {
// this doesn't override method, why not?
public void addFood(CatFood food) { }
// this does
public void addFood(PetFood<Cat> food) { }
}
因此,基本上,我想做的是使CatBowl實現PetBowl,但是addFood()方法僅允許添加CatFood。
我唯一能提出的解決方案是:
...
// PetBowl
interface PetBowl<T extends Pet, F extends PetFood<T>> {
public void addFood(F food);
}
// CatBowl
class CatBowl implements PetBowl<Cat, CatFood> {
public void addFood(CatFood food) { }
}
但是,在我的非人為情況下,會有更多的參數,這最終使到處都是很多樣板,因此我希望有一個“更整潔”的解決方案。
這與泛型並沒有真正的聯系。 接口PetBowl<Cat>
具有方法addFood(PetFood<Cat> food)
。 因此,任何實現此接口的類都應具有這樣的方法。 addFood(CatFood food)
是不可接受的,因為它不允許添加任何種類的PetFoo<Cat>
,而只能添加CatFood
。
就像你有
interface A {
void add(Object o);
}
class AImpl implements A {
public void add(String s);
}
顯然, AImpl.add
不會覆蓋A.add
,因為它僅接受String
,而不接受Object
。
是的,該接口的承諾是可以帶一個PetFood<Cat>
因此,如果您有能力使用CatFood
則可以限制類可以采用的類型...並打破“接口”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.