【问题标题】:Using generic method return type, list使用泛型方法返回类型,列表
【发布时间】:2014-10-16 00:22:45
【问题描述】:

我正在查询一项休息服务并尝试将 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 而是单个类时它正在工作。但我希望该方法能够同时处理列表和单个类。

【问题讨论】:

  • 这不适用于List,因为由于类型擦除,该方法不会收到有关它获取的列表类型的任何信息并返回一个原始List,这不一定相同键入您期望的结果。
  • 这是否意味着我必须对List 类型和单一类型有单独的方法?

标签: java class generics type-conversion


【解决方案1】:

这将编译:

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

或者

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

泛型是一锅新鱼,你需要清楚地理解。

如果声明Class&lt;List&lt;Dome&gt;&gt;,编译器会将有界类型T 理解为List&lt;Dome&gt;。通过使用通配符?extending 对其类型解除限制,这会起作用吗?

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

【讨论】:

  • Error:(47, 113) java: inconvertible types required: java.lang.Class&lt;java.util.List&lt;helper.dto.rest.GridNodeDTO&gt;&gt; found: java.lang.Class&lt;capture#1 of ? extends java.util.ArrayList&gt;
猜你喜欢
  • 2016-12-24
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多