java - Java 泛型类型:如何正确传递正确的类类型?
问题描述
我有一个像这样的抽象类:
public abstract class AnimalService<T extends Animal> {
...
public T callAPI() {
// here the Class<T> can be Fish.class or Salmon.class or any child class type of Animal
return restTemplate.getForObject(url, Class<T>, params);
}
}
和一个子类:
public class FishService<T extends Fish> extends AnimalService<Fish> {
...
}
和孙子班:
public class SalmonService extends FishAnimalService<Salmon> {
...
}
我认为这种遗产存在设计问题。callAPI()
但是,当我调用(在FishService
or中)时,我怎样才能实现这一点SalmonService
,我能够传递我调用的确切类类型(例如Fish.class
or Salmon.class
)?
解决方案
一种选择是添加一个在子类中被覆盖的抽象方法以返回正确的类类型:
public abstract class AnimalService<T extends Animal> {
public T callAPI() {
return restTemplate.getForObject(url, getAnimalClass(), params);
}
abstract Class<T> getAnimalClass();
}
public class SalmonService extends FishAnimalService<Salmon> {
Class<Salmon> getAnimalClass() {
return Salmon.class;
}
}
另一种选择是引入实例变量。
abstract class AnimalService<T extends Animal> {
private Class<T> animalClass;
protected AnimalService(Class<T> animalClass) {
this.animalClass = animalClass;
}
public T callAPI() {
return restTemplate.getForObject(url, animalClass, params);
}
}
public class FishService<T extends Fish> extends AnimalService<Fish> {
protected FishService(Class<T> fishClass) {
super(fishClass);
}
}
public class SalmonService extends FishAnimalService<Salmon> {
public SalmonService() {
super(Salmon.class);
}
}
推荐阅读
- d3.js - 如何不匹配 D3 的结束标签?
- python - numpy 数组是如何做到这一点的,它是否正确?
- javascript - Getting child element with Enzyme
- sql - 将 Access 转换为 SQL Server 查询时除以零错误
- google-sheets - 当在单元格 z 中输入值时,公式从单元格 y 中的单元格 x 返回值
- sql - 访问 SQL IIF 语句未正确评估
- c# - 使用 StreamReader 反序列化 json 数组
- json - 使用控制台将多条 JSON 记录加载到 BigQuery
- json - Json 到 Angular 对象
- python - 功能/真值