[英]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.