我有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>
答案 0 :(得分:5)
将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
的特定方法在列表上提供某些处理,这可能会有所帮助。