[英]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.