Java泛型覆盖方法

标签 java generics overriding

我刚开始使用泛型(我知道参加晚会已经很晚了),不确定我想要实现的目标是否可行,如果可行,如何实现。

好的,这是我试图实现的一个人为的例子,希望能毫无困惑地显示模式:

// 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/

相关文章:

订阅 PostgreSQL/MySql 的 Java 应用程序

java - 如何将字符串转换为多项式并对其进行加减?

typescript - 如何通过 TypeScript 中的类型来描述元组数组中元组元素之间的关系?

ruby-on-rails - 覆盖ApplicationRecord初始化,不好的主意吗?

java - 接口(interface)和覆盖接口(interface)的方法

java - 处理多人游戏中的玩家闪烁

java - DFS 方法未产生预期输出

c# - 是否可以创建具有通用事件的类?

c# - 如何检查给定值是否为通用列表?

java - 在延迟初始化和一般情况下,覆盖可以有效替代 if 语句吗?