Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java方法中使用泛型_Java_Generics - Fatal编程技术网

如何在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;
}
只要确保在type
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;
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的答案是正确的!再次感谢大家!