Я новичок в использовании дженериков (очень поздно для вечеринки, я знаю), и не уверен, возможно ли то, чего я пытаюсь достичь, и если да, то как.
Хорошо, это надуманный пример того, чего я пытаюсь достичь, который, надеюсь, показывает шаблон без каких-либо помех:
// 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) { }
}
Тем не менее, в моем не надуманном случае есть больше параметров, и это в конечном итоге приводит к большому количеству шаблонов повсюду, поэтому я надеюсь на «более аккуратное» решение.