Chciałbym mieć zwierzaki różnych gatunków, które mogą mieć ze sobą potomstwo - Koty tylko z Kotami, a Kury z Kurami. Dawanie potomstwa może przebiegać różnie dla różnych gatunków, ale chciałbym, aby do rozmnożenia np. 34 Królików z 2 użyć tej samej metody(parametryzowanej typem) co do rozmnażenia np. Kur. Logiczne, żeby wszystkie gatunki implementowały wspólny interfejs albo klasę abstrakcyjną:
abstract class Zwierzak
{
abstract Zwierzak potomek(Zwierzak z);
}
Niestety takie rozwiązanie nie działa, bo tutaj metoda potomek pozwala na wywołanie dla Kury i Kota. W jaki sposób zastrzec, że parametr i wynik metody potomek mają być tego samego typu(a nie tylko oba Zwierzakami).
abstract class Zwierzak
{
abstract <E extends Zwierzak> E potomek(E e1);
}
też nie działa, bo co prawda Kura nie da potomka z Kotem, ale i tak implementując metodę potomek w klasie Kura muszę napisać, jak działa dla dowolnych 2 zwierzaków jednego gatunku.
Mam nadzieję, że ktoś to zrozumiał i podsunie mi jakieś rozwiązanie.