我刚开始使用泛型(我知道参加晚会已经很晚了),不确定我想要实现的目标是否可行,如果可行,如何实现。
好的,这是我试图实现的一个人为的例子,希望能毫无困惑地显示模式:
// 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)
.所以,任何实现这个接口(interface)的类都应该有这样一个方法。 addFood(CatFood food)
是 Not Acceptable ,因为它不允许添加任何类型的 PetFoo<Cat>
, 但只有 CatFood
.
就好像你有一样
interface A {
void add(Object o);
}
class AImpl implements A {
public void add(String s);
}
显然,AImpl.add
不会覆盖 A.add
, 因为它只接受 String
s,而不是 Object
关于Java泛型覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6995302/