簡體   English   中英

Java泛型-無法使用擴展的泛型覆蓋方法

[英]Java Generics - Cannot override a method with an extends generic

我在服務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的任何方法。

怎么了?

您在abstrct類中聲明的方法簽名表示該方法應接受EntityFilter 任何子類作為該參數。

實際上,類型變量在那里是多余的:您最好將其聲明為:

public Specification<T> getSpecification(EntityFilter entityFilter)

您要在子類中嘗試做的是使參數類型比EntityFilter更具體; 但是Liskov替換原則禁止這樣做,該原則規定子類必須為:

  • 他們接受的參數不再具體;
  • 它們返回的值不再籠統。

因此,您試圖在子類中聲明的方法實際上不會覆蓋超類型中的方法,因此被禁止。

為了解決這個問題,您需要使過濾器類型成為類級別的類型變量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM