我想实现一个泛型类,用于缓存本地MongoDB实例中REST API的结果。为此,我需要反序列化我从JerseyClient获得的集合:
Response response = this.source.request().get();
List<T> list = response.readEntity( new GenericType<List<T>>() {} );
// ... do stuff with the list
假设我在与T
相关的Foo
上下文中使用了这段代码。真的很奇怪的是,在readEntity
来电之后,list
不是List<Foo>
,而是List<LinkedHashMap>
。当我明确宣布Generic T
为Foo
时,这怎么可能呢?
我需要做些什么才能获得合适的List<T>
,即List<Foo>
?
注意:如果我删除了通用,请使用
List<Foo> list = response.readEntity( new GenericType<List<Foo>>() {} );
直接相反,它工作正常,但我真的需要那个通用的存在!
答案 0 :(得分:5)
Java最普遍的泛型借口:类型擦除
如果您可以将班级类型传递为Class<T> clazz
,那么您可以使用:
GenericType<List<T>> genericType = new GenericType<>(new ParameterizedType() {
public Type[] getActualTypeArguments() {
return new Type[]{clazz};
}
public Type getRawType() {
return List.class;
}
public Type getOwnerType() {
return null;
}
});
response.readEntity(genericType);
答案 1 :(得分:0)
您可以使用
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import javax.ws.rs.core.GenericType;
GenericType<List<T>> genericType = new GenericType<>(
ParameterizedTypeImpl.make( List.class, new Type[]{classType}, null));