如何在java方法中使用泛型

时间:2014-02-11 17:16:30

标签: java generics

我无法将泛型添加到我正在处理的一段代码中,我已经四处寻找,到目前为止我看到的所有示例都没有捕捉到我想要做的事情,所以我'我伸手去寻求帮助。

目前我有这个代码处理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;
  }

感谢任何帮助或建议。非常感谢提前:))

3 个答案:

答案 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大小)