簡體   English   中英

如何在Java方法中使用泛型

[英]How to use generics in a java method

我在向正在處理的一段代碼中添加泛型時遇到了麻煩,我進行了搜索,到目前為止,我所看到的所有示例都沒有捕捉到我正在嘗試做的事情,因此我正在嘗試求助。

當前,我有這段代碼可以處理UserDTO對象的列表, UserDTO對象僅填充了其ID,並從一個寧靜的Web服務獲取每個User的完整詳細信息:

//userIds  and userDetails declared previously
for (UserDTO user : userIds) {
    UserDTO populatedUser = webResource.path(REST_USER_PATH).path(user.getId().
        toString()).type(MediaType.APPLICATION_XML).get(ClientResponse.class).
            getEntity(UserDTO.class);

    userDetails.add(populatedUser);
}

現在,這將是為這塊我目前正在開展工作的方式,我需要能夠轉換列表DTO具有對象只是標識的人口,到完全填充的名單DTO對象通過調用一個Web服務。 我想做的是創建一個通用方法讓我做到這一點。

我需要執行此操作以擴展BaseDTO所有不同DTO對象,因此我BaseDTO了以下內容,不幸的是它沒有編譯,但希望它將顯示我要完成的工作:

  public <T extends BaseDTO> getListOfPopulatedDTOs(
      List <T extends BaseDTO> unpopulatedDTOs, String restPath) {

      List<BaseDTO> populatedDTOs = new ArrayList<BaseDTO>();

      for (BaseDTO unpopulatedDTO : unpopulatedDTOs) {
          BaseDTO populatedDTO = webResource.path(restPath).path(
              unpopulatedDTO.getId().toString()).type(MediaType.APPLICATION_XML).
                  get(ClientResponse.class).getEntity(T.class);

          populatedDTOs.add(populatedDTO);
      }

      return populatedDTOs;
  }

任何幫助或建議將不勝感激。 提前謝謝了 :)

您無需在形式參數中再次給出界限。 而且T.class無效。 您必須將Class<T>顯式傳遞給方法。 您可以將方法更改為如下所示:

public <T extends BaseDTO> List<T> populateDTOList(List<T> unpopulatedDTOs, Class<T> clazz, String restPath) {
    List<T> populatedDTOs = new ArrayList<T>();

    for (T unpopulatedDTO : unpopulatedDTOs) {
        T populatedDTO = webResource.path(restPath)
                            .path(unpopulatedDTO.getId().toString())
                            .type(MediaType.APPLICATION_XML)
                            .get(ClientResponse.class)
                            .getEntity(clazz);

        populatedDTOs.add(populatedDTO);
    }

    return populatedDTOs;
}

只要確保您具有在BaseDTO類型中聲明的getId()方法,否則您將無法訪問它。

另外,您缺少該方法的返回類型。 我把它放在這里了。 而且該方法更好地命名為populateDTOList

您只需要聲明一次類型信息。在泛型方法中,您可以在返回類型之前執行此操作,而不是在參數本身中執行。只需將其更改為:

 public <T extends BaseDTO> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath) {
List<BaseDTO> populatedDTOs = new ArrayList<BaseDTO>();

for (BaseDTO unpopulatedDTO : unpopulatedDTOs) {
  BaseDTO populatedDTO = webResource.path(restPath).path(unpopulatedDTO.getId().toString()).type(MediaType.APPLICATION_XML)
      .get(ClientResponse.class).getEntity(T.class);

  populatedDTOs.add(populatedDTO);
}

return populatedDTOs;

泛型僅是編譯時檢查。 因此,您無法執行T.class因為T和所有其他常規信息在編譯期間會被刪除。

您的界面可能類似於:

public <T extends BaseDTO> List<T> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath)

您可以執行getEntity(unpopulatedDTOs.get(0).getClass()) (檢查列表是否不為null或0大小)

暫無
暫無

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

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