在子类中定义List的类型

Jon*_*nas 3 java

我有一个abstract class Workout与类WorkoutCircuitWorkoutSNR从继承Workout.

此外,我有abstract class Exercise和类ExerciseCircuitExerciseSNR继承形式Exercise.

该类Workout有一个ArrayList<Exercise> exercises,带有相应的getter和setter方法.现在我希望能够调用getExercises()一个Object WorkoutCircuit并获得一个ArrayList<ExerciseCircuit>返回,反之亦然WorkoutSNR.

我haven't想出如何做到这一点,因为我不能覆盖getExercises()的子类和方法的情况下ArrayList<Exercise>进入ArrayList<ExerciseCurcuit>

dav*_*xxx 5

创建Workout泛型类是一个很好的例子,以便允许子类定义List返回的元素类型getExercises().
通用类允许parametric polymorphism,这是你正在寻找的.
您可以定义Workout如下:

public abstract class Workout<T extends Exercise>{

   private List<T> exercises;
   public List<T> getExercises(){
      return exercices;
   }
   ...
}
Run Code Online (Sandbox Code Playgroud)

子类可以是:

public class WorkoutCircuit extends Workout<ExerciseCircuit>{
   ...     
}
Run Code Online (Sandbox Code Playgroud)

并且:

public class WorkoutSNR extends Workout<ExerciseSNR>{
   ...     
}
Run Code Online (Sandbox Code Playgroud)

请注意,使用有界类型参数(class Workout<T extends Exercise)不是必需的.例如,class Workout<T>这将是合法的,这意味着子类接受任何类型.
但是指定更精确的类型有两个好处:

  • 它允许限制子类可以使用的可能类型.
  • 它允许抽象类操作特定的声明类型:Exercice而不是Object.如果类使用特定方法在列表上提供一些处理,这可能会有所帮助Exercice.