Java泛型覆盖方法

时间:2011-08-09 11:17:15

标签: java generics override

我不熟悉使用泛型(我知道派对很晚),并且不确定我想要实现的目标是否可能,如果是,那么如何。

好的,这是我试图实现的一个人为的例子,希望能够在没有任何混乱的情况下显示模式:

// 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) { }

}

然而,在我非设计的情况下,有更多的参数,这最终会产生大量的样板,所以我希望有一个“更整洁”的解决方案。

2 个答案:

答案 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取得,那么你会限制你的班级可以采取的类型......并打破“界面”。