gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 21:15:26 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com