java - 在子类中定义 List 的类型
问题描述
我有一个abstract class Workout
和类WorkoutCircuit
,WorkoutSNR
它继承自Workout
.
我也有abstract class Exercise
和 类ExerciseCircuit
和ExerciseSNR
继承形式Exercise
。
该类Workout
有一个ArrayList<Exercise> exercises
, 以及相应的 getter 和 setter 方法。现在我希望能够调用getExercises()
一个对象WorkoutCircuit
并获得一个ArrayList<ExerciseCircuit>
返回,反之亦然WorkoutSNR
。
我还没有想出如何做到这一点,因为我不能覆盖子类中的方法getExercises()
和案例ArrayList<Exercise>
ArrayList<ExerciseCurcuit>
解决方案
Workout
为了允许子类定义List
返回的元素的类型,创建一个泛型类是一个很好的例子getExercises()
。
泛型类允许parametric polymorphism
,这是您正在寻找的。
您可以定义Workout
如下:
public abstract class Workout<T extends Exercise>{
private List<T> exercises;
public List<T> getExercises(){
return exercices;
}
...
}
子类可能是:
public class WorkoutCircuit extends Workout<ExerciseCircuit>{
...
}
和 :
public class WorkoutSNR extends Workout<ExerciseSNR>{
...
}
请注意,有界类型参数 ( class Workout<T extends Exercise
) 的使用不是强制性的。例如class Workout<T>
,这将是合法的,这意味着子类可以接受任何类型。
但是指定更精确的类型有两个优点:
- 它允许限制子类可以使用的可能类型。
- 它允许抽象类操作特定声明的类型:
Exercice
而不是Object
. 如果该类使用Exercice
.
推荐阅读
- spring - 部署错误:在 JBOSS EAP 上部署 Spring Boot 应用程序时
- mongodb - 如何使用 $graphLookup 在 MongoDB 树中按路径有效地查找链接项目?
- flutter - Dart Flutter 从 HttpClient 访问 document.cookie
- java - 使用 maven 模板和 docker 模板的问题
- oracle - 如何添加异常以避免在触发器中重复插入
- python - For 循环将带有纬度和经度的 .csv 文件与 Dataclass 进行比较
- android - 如何在android studio中向用户显示预览之前实时修改来自相机的帧?
- flutter - 列表
- python - NI DAQmx :如何在 cDAQ9171 中配置软件触发
- python - 使用 exchangelib 从日历请求数据时出现问题