簡體   English   中英

Java泛型,需要解釋

[英]Java generics, explanation needed

有幾個簡單的測試用例類:

public interface ListCriteria<T> {
  // some stuff here
}

public class UserListCriteria implements ListCriteria<User> {
 // implementation
}

public interface Editor<T> {
  // sample method 1
  List<T> listObjectsTest1(ListCriteria<T> criteria);
  // sample method 2
  <L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);
}

還有一個編譯Editor的實現,Java認為它沒有為兩個示例方法提供必要的實現:

public class UserEditor implements Editor<User> {

  @Override
  public List<User> listObjectsTest1(UserListCriteria criteria) {
    //
  }

  @Override
  public List<User> listObjectsTest2(UserListCriteria criteria) {
    //
  }
}

兩種方法實現都是錯誤的。 問題是為什么。 特別是對於后一種方法。 當然我可以做interface Editor<T, L extends ListCriteria<T>> ,這將解決問題,但我不想,我想了解為什么我不能在這里使用方法級泛型。

您獲得的錯誤與泛型無關,因為您使用除接口強制之外的其他類型實現該方法。

Editor界面定義

List<T> listObjectsTest1(ListCriteria<T> criteria);

因此UserEditor必須在您的情況下實現

public List<User> listObjectsTest1(ListCriteria<User> criteria) {

您不應該將參數的類型與參數的泛型類型混淆。 Editor界面強制執行ListCriteria類型。 ListCriteria的泛型類型是TT可以由子類綁定,例如implements ListCriteria<User> 當我說“你得到的錯誤與泛型無關”時,這就是我的意思。

我猜你想要的是什么

public interface Editor<C, T extends ListCriteria<C>> {
    List<C> listObjectsTest1(T criteria);
}

然后UserEditor可以實現為

public class UserEditor implements Editor<User, UserListCriteria> {

   public List<User> listObjectsTest1(UserListCriteria criteria) {
      return null;
   }
}

為什么? 特別是對於后一種方法

Editor界面中的第二個方法

  <L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria);

並不意味着您可以實現L的任何類型綁定UserEditor仍然必須實現

public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {
    return null;
}

此方法定義將在客戶端調用方法時綁定的泛型類型L 因此,您可以使用任何類型作為ListCriteria<User>的子類型調用該方法。

  1. UserEditor listObjectsTest1(UserListCriteria criteria)函數沒有覆蓋Editor<T>接口的函數listObjectsTest1(ListCriteria<T> criteria) ,因為它們有兩個不同的簽名,即本質上是參數類型。

  2. 對於在接口中聲明的listObjectsTest2也是如此: <L extends ListCriteria<T>> List<T> listObjectsTest2(L criteria); 但是您已在UserEditor類中將其聲明為: List<User> listObjectsTest2(UserListCriteria criteria)

因此,您需要將簽名更改為:

class UserEditor implements Editor<User> {


    @Override
    public List<User> listObjectsTest1(ListCriteria<User> criteria) {

    }

    @Override
    public <L extends ListCriteria<User>> List<User> listObjectsTest2(L criteria) {

    }
}

請閱讀jls 8.4.8。 繼承,覆蓋和隱藏更多細節。

暫無
暫無

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

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