Java Generics - 无法使用extends generic覆盖方法

时间:2016-10-26 13:46:13

标签: java generics override

我在服务AbstractClass中有这个方法:

public <E extends EntityFilter> Specification<T> getSpecifications(E entityFilter) {
    return null;
}

然后我也有EntityFilter的实现:

public class UserEvaluationFilter implements EntityFilter {
    @Getter
    @Setter
    private String evaluator;
}

我想覆盖我的serviceClass(它扩展控制器AbstractClass)方法中的AbstractClass,如下所示:

@Override
public Specification<UserEvaluation> getSpecifications(UserEvaluationFilter filter) {
    return doStuff();
}

编译器说这不会覆盖我的AbstractClass的任何方法。

出了什么问题?

1 个答案:

答案 0 :(得分:3)

您在abstrct类中声明的方法签名表示该方法应接受 EntityFilter的任何子类作为该参数。

实际上,类型变量在那里是多余的:您也可以将其声明为:

public Specification<T> getSpecification(EntityFilter entityFilter)

您在子类中尝试执行的操作是使参数类型比EntityFilter更具体;但是Liskov Subtitution Principle禁止这样做,它表示子类必须是:

  • 他们接受的参数不再具体;
  • 他们返回的值不再一般。

因此,您尝试在子类中声明的方法实际上并未覆盖超类型中的方法,因此它是禁止的。

要处理此问题,您需要使过滤器类型为类级别类型变量:

class AbstractClass<T, E extends EntityFilter> {
  public Specification<T> getSpecifications(E entityFilter) {
    return null;
  }
}