java - Stream collect with Generic 类型

标签 java java-8

我尝试在将 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/

相关文章:

java - 使用参数在对象上调用非静态方法引用

Java:根据 "\n"的数量从字符位置计算行号

java - 如何在Java中检测矩形的哪条边被击中

java - 使用 Java,将图像保存到文件的最佳方法是什么?

spring - PSQLException - spring boot 1.4.1 - spring data jpa - offsetdatetime/localdatetime 标识为字节流

java - 在取 max (0,x) 的同时对流中的元素求和?

java - 为什么 Java 8 中的 HashMap 使用二叉树而不是链表?

java - 如何将 Java 8 IntStream 转换为列表?

java - 如何在一个文件夹中的多个文件中附加日期和时间,同时将其移动到另一个文件夹

java - 序列化和存储为实例变量的对象