我在服务 AbstractClass 中有这个方法:
public <E extends EntityFilter> Specification<T> getSpecifications(E entityFilter) {
return null;
}
然后我也有一个 EntityFilter 的实现:
public class UserEvaluationFilter implements EntityFilter {
@Getter
@Setter
private String evaluator;
}
我想重写我的serviceClass(它扩展了 Controller AbstractClass)方法中的AbstractClass,如下所示:
@Override
public Specification<UserEvaluation> getSpecifications(UserEvaluationFilter filter) {
return doStuff();
}
编译器说这不会覆盖我的 AbstractClass 的任何方法。
出了什么问题?
最佳答案
您在abstrct类中声明的方法签名表示该方法应该接受EntityFilter
的任何子类作为该参数。
实际上,类型变量在那里是多余的:您不妨将其声明为:
public Specification<T> getSpecification(EntityFilter entityFilter)
您在子类中尝试做的是使参数类型比EntityFilter
更具体;但这是Liskov Subtitution Principle禁止的,它表示子类必须是:
- 他们接受的参数没有更具体的内容;
- 它们返回的值不再通用。
因此,您尝试在子类中声明的方法实际上不会覆盖父类(super class)型中的方法,因此是被禁止的。
要解决这个问题,您需要将过滤器类型设置为类级别类型变量:
class AbstractClass<T, E extends EntityFilter> {
public Specification<T> getSpecifications(E entityFilter) {
return null;
}
}
关于Java 泛型 - 无法使用扩展泛型覆盖方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40264034/