我正在查询休息服务并尝试将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而是单一类时,它正在工作。但我希望该方法能够同时使用,列表和单个类。
答案 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文档将有所帮助。