【问题标题】:Java Generic type inheritanceJava 泛型类型继承
【发布时间】:2021-10-11 15:09:01
【问题描述】:

我有一个声明为类似的基本服务

BaseService<M, S>

我有另一个服务扩展了声明的基本服务:

AnimalService extends BaseService<Animal, AnimalStatus>

现在,我需要另一个服务来传递模型狗而不是动物(狗扩展动物),创建一个新服务会很好地工作:

DogService extends BaseService<Dog, AnimalStatus>

问题是,DogService 在功能上与 AnimalService 基本相同,因此为狗声明另一个服务只是重复 AnimalService 的代码。

有没有一种方法可以声明 DogService 以便它可以在使用新模型 Dog 时重用 Animal 服务中的代码,或者是否有一种方法可以以通用方式声明 AnimalService 以便它也可以接受模型狗?

【问题讨论】:

  • AnimalService&lt;T extends Animal&gt; extends BaseService&lt;T, AnimalStatus&gt; 可以解决问题。这样,我们可以使用AnimalAnimal 的任何其他子类(例如Dog)对其进行初始化。

标签: java generics inheritance


【解决方案1】:

我建议将AnimalService 定义为一个泛型类本身,如下所示:

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

这允许我们使用扩展 Animal 的类型来实例化 AnimalServices,甚至是 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> {
    ...
}

【讨论】:

    猜你喜欢
    • 2011-08-17
    • 2015-07-04
    • 2018-09-27
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    相关资源
    最近更新 更多