如何在java方法中使用泛型
我在为我正在编写的代码添加泛型时遇到了问题,我四处搜索过,到目前为止,我所看到的示例中没有一个能够很好地捕捉到我试图做的事情,因此我正在寻求帮助 目前,我有一个代码,它将如何在java方法中使用泛型,java,generics,Java,Generics,我在为我正在编写的代码添加泛型时遇到了问题,我四处搜索过,到目前为止,我所看到的示例中没有一个能够很好地捕捉到我试图做的事情,因此我正在寻求帮助 目前,我有一个代码,它将UserDTO对象的列表处理为只填充了其ID的对象,并从restful web服务获取每个User的完整详细信息: //userIds and userDetails declared previously for (UserDTO user : userIds) { UserDTO populatedUser = w
UserDTO
对象的列表处理为只填充了其ID的对象,并从restful 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);
}
现在,这将是我目前正在进行的工作的一种模式,我需要能够通过调用web服务将刚刚填充了Id的DTO
对象列表转换为完全填充的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;
}
public getListofPopulatedTos(
列出未填充的DTO,字符串restPath){
List PopulatedTos=new ArrayList();
for(基本到未填充的DTO:未填充的DTO){
BaseDTO PopulatedTo=webResource.path(restPath.path)(
未填充的dto.getId().toString()).type(MediaType.APPLICATION_XML)。
get(ClientResponse.class).getEntity(T.class);
populatedTos.add(populatedTo);
}
返回已填充的DTO;
}
任何帮助或建议都将受到感激。非常感谢:)您不需要在形式参数中再次给出边界。而且
T.class
无效。您必须将类
显式地传递给该方法。您可以将方法更改为以下内容:
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;
}
public List populateDTOList(列出未填充的DTO、类clazz、字符串restPath){
List PopulatedTos=new ArrayList();
for(T未填充的DTO:未填充的DTO){
T populatedTo=webResource.path(restPath)
.path(未填充的dto.getId().toString())
.type(MediaType.APPLICATION_XML)
.get(ClientResponse.class)
.getEntity(clazz);
populatedTos.add(populatedTo);
}
返回已填充的DTO;
}
只要确保在typeBaseDTO
中声明了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;
public getListofPopulatedTos(列出未填充的DTO,字符串restPath){
List PopulatedTos=new ArrayList();
for(基本到未填充的DTO:未填充的DTO){
BaseDTO PopulatedTo=webResource.path(restPath).path(UnpopulatedTo.getId().toString()).type(MediaType.APPLICATION_XML)
.get(ClientResponse.class).getEntity(T.class);
populatedTos.add(populatedTo);
}
返回已填充的DTO;
泛型只是编译时检查。因此不能执行t.class
,因为t和所有其他泛型信息在编译过程中都会被删除
您的界面可能类似于:
public <T extends BaseDTO> List<T> getListOfPopulatedDTOs(List <T> unpopulatedDTOs, String restPath)
public List getListofPopulatedTos(列出未填充的DTO,字符串restPath)
您可以执行
getEntity(unpopulatedTos.get(0.getClass())
(检查列表是否为空或大小是否为0)你能分享编译错误吗?我正在学习-所以问题-如果他想要一个通用方法-你如何摆脱在方法中硬编码的'ClientResponse.class',对吗?你不需要某种类型的clazz或更通用的东西吗?或者ClientResponse是响应数据的'基本'类吗?我正在学习-所以问题关于-如果他想要一个通用方法-你如何摆脱在方法中硬编码的“ClientResponse.class”,对吗?你不需要某种类型的clazz或更通用的东西,或者ClientResponse是响应数据的“基本”类吗?@mikemil问得好。你应该把它贴在问题本身上,这样我们就可以得到答案m OP.感谢大家的回复,我必须感谢大家的快速回复。Rohit的答案似乎最完整,但我调用该方法时遇到问题。我将在问题中发布其他信息。再次感谢!事实上我解决了编译错误,我只是用错误的参数调用!Rohit的答案是正确的!再次感谢大家!