3 回答
TA贡献1842条经验 获得超21个赞
快速解决方案:
private <T extends TypeInterface> List<DBObject> getDataUsingJsonPath(String path, Class<T> type) {
Configuration configuration = Configuration
.builder()
.mappingProvider(new JacksonMappingProvider())
.jsonProvider(new JacksonJsonProvider())
.build();
List<T> items = JsonPath.using(configuration).parse(jsonString).read(path, (Class<List<T>>) new ArrayList<T>().getClass());
这个想法是摆脱TypeRef<List<T>>它的工作,但会产生警告。
TA贡献1812条经验 获得超5个赞
编译器将编译new TypeRef<List<T>>() {};
为对 的引用List<T extends TypeInterface>
,而不是由 提供的元素类型type
。
看起来 JsonPath 不支持通过指定类来进一步细化 typeref。查看源代码,可以使用更扩展的库,如番石榴,并进行以下修改:
TypeToken<T>
像构建 guava一样构造 guavaTypeRef<T>
,但使用.where(new TypeParameter<T>() {}, type)
将类型变量细化为最终类型。围绕新的 typetoken 创建一个包装器,为 JsonPath 提供精炼的类型:
包装:
class TokenRef<T> extends TypeRef<T> {
private final TypeToken<T> token;
public TokenRef(TypeToken<T> token) {
super();
this.token = token;
}
@Override
public Type getType() {
return this.token.getType();
}
}
TA贡献1851条经验 获得超4个赞
这里有一些很好的答案,但是,经过一段时间的睡眠后,我选择将 TypeRef 移动为实际参数。
private <T extends TypeInterface> List<DBObject> getDataUsingJsonPath(String path, TypeRef<List<T>> type) {
然后我可以按预期迭代结果:
List<T> items = JsonPath.using(configuration).parse(responseString).read(path, type);
for(T item : items) {
// do generic TypeInterface stuff here
我不知道这是否是最好的、最正确的、“通用”的方法,但到目前为止很好,而且在阅读我认为的代码时基本上是有道理的。
添加回答
举报