簡體   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