【发布时间】: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