Наследование универсального типа Java

#java #generics #inheritance

Вопрос:

У меня есть базовая служба, объявленная как

 BaseService<M, S>
 

У меня есть еще одна служба, которая расширяет базовую службу, объявленную как:

 AnimalService extends BaseService<Animal, AnimalStatus>
 

Теперь мне нужна другая служба для передачи модели Собаки вместо животного(Собака расширяет животное), создание новой службы будет работать отлично:

 DogService extends BaseService<Dog, AnimalStatus>
 

Дело в том, что DogService в основном функционально совпадает с AnimalService, поэтому объявление другой службы только для собаки-это просто повторение кода AnimalService.

Есть ли способ объявить службу DogService, чтобы она могла повторно использовать код в службе животных при использовании новой модели собаки, или существует способ объявить службу AnimalService общим способом, чтобы она также могла принять модель собаки?

Комментарии:

1. AnimalService<T extends Animal> extends BaseService<T, AnimalStatus> это бы сработало. Таким образом, мы можем инициализировать его с Animal помощью или любого другого подкласса Animal (например Dog ).

Ответ №1:

Я бы рекомендовал определить AnimalService сам универсальный класс как такой:

 AnimalService<T extends Animal> extends BaseService<T, AnimalStatus> {
    ...
}
 

Это позволяет нам создавать экземпляры AnimalService s с расширением типов Animal и даже Animal само по себе:

 class Animal {
    ... 
}

class Dog extends Animal {
    ...
}

...

final AnimalService<Animal> animalService = new AnimalService<Animal>();
final AnimalService<Dog> dogService = new AnimalService<Dog>();
 

В случае , если нам нужен отдельный класс DogService , чтобы добавить или переопределить некоторые методы, мы также можем определить его как:

 class DogService extends AnimalService<Dog> {
    ...
}