我尝试在将 json 反序列化为 pojo 的方法中使用泛型,以便它可以返回任何对象类型。
这是我的代码:
private Bla(List<A> as, List<B> bs)
{
this.as = as;
this.bs = bs;
}
public static Bla from(JsonObject json)
{
return new Bla(Bla.<A>load(json, As), Bla.<B>load(json, Bs));
}
private static <T> List<T> load(JsonObject jsonObject, String param)
{
return jsonObject.getJsonArray(param).stream()
.map(Bla::getItem)
.collect(Collectors.toList());
}
private static <T> T getItem(Object json)
{
try {
return mapper.readValue(json.toString(), new TypeReference<T>() {
});
} catch (IOException e) {
throw new RuntimeException("Error parsing json items", e);
}
}
问题是 .collect(Collectors.toList());
似乎无法编译,因为无法解析实例类型。
编译错误为:
Error:(43, 25) java: incompatible types: inference variable T has incompatible bounds equality constraints: T lower bounds: java.lang.Object
为了避免混淆,在我的示例中 A 和 B 是 Pojos
问候。
最佳答案
让我们检查一下这个方法:
private static <T> List<T> load(JsonObject jsonObject, String param)
{
return jsonObject.getJsonArray(param).stream()
.map(Bla::getItem)
.collect(Collectors.toList());
}
最后一步的类型,Collectors.toList()
必须是 List<T>
, 但要获取上一步的类型,Bla::getItem
必须推断为 T getItem
.自 getItem
是一种通用方法,这需要一种复杂的类型约束传播模式,这显然超出了 Java 的类型推断所能处理的范围。要解决这个问题,请通过提示帮助编译器:
.map(Bla::<T>getItem)
(此句法变体归功于用户 Nándor Előd Fekete)。
第二个问题是您的 getItem
方法:
private static <T> T getItem(Object json)
{
return mapper.readValue(json.toString(), new TypeReference<T>() {};
}
使用 TypeReference
这里没有帮助,因为 T
不是具体类型。它将在编译器在这里创建的匿名类中保持非具体化,因此 Jackson 不会从中得到任何有用的提示。您可以使用更简单的 readValue
不带 TypeReference
的签名.
关于java - Stream collect with Generic 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40287152/