繁体   English   中英

Java泛型重写方法

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM