使用泛型方法返回类型,列表

时间:2014-08-22 07:48:58

标签: java class generics type-conversion

我正在查询休息服务并尝试将xml响应反序列化为jaxb注释类。我想使用泛型返回类型,但我无法弄清楚如何将自定义类型列表类传递给方法的语法。我现在有以下方法。

@SuppressWarnings("unchecked")
protected <T> T getRestResponse(String path, List<String[]> params, final Class<T> type) {
    ResteasyWebTarget target = getTarget();
    target = target.path(path);
    if (params != null) {
        for (String[] s : params) {
            target = target.queryParam(s[0], s[1]);
        }
    }

    Response response = target.request(MediaType.APPLICATION_XML).get();

   // This works!
   // List<GridNodeDTO> gridNodeDTOs = response.readEntity(new GenericType<List<GridNodeDTO>>() {
    });
    // This does not, List is not expected: Unable to find a MessageBodyReader of content-type application/xml and type interface java.util.List
    return (T)response.readEntity(new GenericType(type) {});
}

我称之为:

    Class<List<GridNodeDTO>> clazz = (Class) List.class;
    // clazz is: interface java.util.List
    List<GridNodeDTO> restResponse = getRestResponse("1/abc", clazz);

以下不编译:

    Class<List<GridNodeDTO>> cl = (Class<List<GridNodeDTO>>) new ArrayList<GridNodeDTO>().getClass();

Error:(46, 103) java: inconvertible types
  required: java.lang.Class<java.util.List<net.s.q.helper.dto.rest.GridNodeDTO>>
  found:    java.lang.Class<capture#1 of ? extends java.util.ArrayList>

当T不是List而是单一类时,它正在工作。但我希望该方法能够同时使用,列表和单个类。

1 个答案:

答案 0 :(得分:1)

这将编译:

Class<? extends List<GridNodeDTO>> cl = (Class<? extends List<GridNodeDTO>>) new ArrayList<GridNodeDTO>().getClass();

或者

Class<? extends List<GridNodeDTO>> cl = new ArrayList<GridNodeDTO>().getClass();

仿制药是一种新的水壶,你需要清楚地了解它。

如果有人声明Class<List<Dome>>,编译器会将有界类型T理解为List<Dome>。通过使用通配符?extending类型取消绑定,这会有效吗?

Bounded Type上的Oracle文档将有所帮助。