我在服务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的任何方法。
出了什么问题?
答案 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;
}
}