我无法将泛型添加到我正在处理的一段代码中,我已经四处寻找,到目前为止我看到的所有示例都没有捕捉到我想要做的事情,所以我'我伸手去寻求帮助。
目前我有这个代码处理UserDTO
个对象的列表,这些对象只填充了他们的ID,并从一个宁静的网络服务中获取每个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);
}
现在这将成为我目前正在进行的工作的模式,我需要能够将只有Id填充的DTO
个对象的列表转换为完全列表通过调用Web服务填充DTO
个对象。我想做的是创建一个通用的方法来让我这样做。
我需要执行此操作的所有不同的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;
}
感谢任何帮助或建议。非常感谢提前:))
答案 0 :(得分:1)
您不需要在形式参数中再次给出边界。 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;
}
请确保您在getId()
类型中声明了BaseDTO
方法,否则您将无法访问它。
此外,您缺少该方法的返回类型。我把它放在这里。并且该方法更好地命名为populateDTOList
。
答案 1 :(得分:0)
你只需要声明类型信息一次。在泛型方法中,你在返回类型之前执行此操作,而不是在参数本身。只需将其更改为: -
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;
答案 2 :(得分:0)
泛型只是编译时间检查。因此,您无法T.class
,因为在编译期间会删除T和所有其他通用信息。
您的界面可能类似于:
public <T extends BaseDTO> List<T> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath)
你可以做getEntity(unpopulatedDTOs.get(0).getClass())
(检查列表不是空或0大小)