Java 泛型 - 无法使用扩展泛型覆盖方法

标签 java generics overriding

我在服务 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/

相关文章:

用作属性的 C# 泛型对象列表 - 无法添加值

ruby-on-rails - 如何正确地重写模块混入的方法?

c++ - 调用重写函数并使用基类中的重载变量

java - 如何使用流在 Java 8 中按值范围分组

java - java(编译器或jvm)是否以不同方式处理类的静态最终成员?如果是如何

java - 如果输入变为默认值,如何返回到 switch 语句的顶部?

java - 转换为可移植文件路径

c# - C# 泛型方法中的 "where T : class"是什么?

java - 从子类访问时类型删除和继承 : An object of List<Number> , 被视为原始列表?

C++ "was not declared in this scope"在派生类中覆盖纯虚方法时