在子类中定义List的类型

时间:2018-05-27 17:23:53

标签: java

我有abstract class Workout以及继承自WorkoutCircuit的班级WorkoutSNRWorkout

此外,我还有abstract class Exercise以及继承ExerciseCircuit格式的ExerciseSNRExercise类。

班级Workout有一个ArrayList<Exercise> exercises,带有相应的getter和setter方法。现在,我希望能够在getExercises()的对象上调用WorkoutCircuit,然后向ArrayList<ExerciseCircuit>调用WorkoutSNR,反之亦然{。}}。

我还没知道如何执行此操作,因为我无法覆盖子类中的getExercises()方法,而ArrayList<Exercise>只能覆盖ArrayList<ExerciseCurcuit>

1 个答案:

答案 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的特定方法在列表上提供某些处理,这可能会有所帮助。