我不熟悉使用泛型(我知道派对很晚),并且不确定我想要实现的目标是否可能,如果是,那么如何。
好的,这是我试图实现的一个人为的例子,希望能够在没有任何混乱的情况下显示模式:
// 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) { }
}
然而,在我非设计的情况下,有更多的参数,这最终会产生大量的样板,所以我希望有一个“更整洁”的解决方案。
答案 0 :(得分:3)
这与泛型无关。界面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
s而非Object
s。
答案 1 :(得分:0)
是的,界面的承诺是它可以花费PetFood<Cat>
所以如果你能够在CatFood
取得,那么你会限制你的班级可以采取的类型......并打破“界面”。