generics - java 8谓词类型不匹配,这段代码对我来说似乎合乎逻辑

标签 generics java-8

这段代码对我来说似乎合乎逻辑,为什么编译器提示谓词 isBondAsset 的类型错误?

我的意思是“扩展 Assets 的任何类型的谓词”是“扩展 Assets 的任何类型的 super 谓词”还是我错了?

private static class Asset
{
    public enum AssetType
    {
        BOND,
        STOCK;
    }

    private final AssetType type;
    private final int value;

    public Asset (AssetType type, int value)
    {
        this.type = type;
        this.value = value;
    }

    public AssetType getType ()
    {
        return type;
    }

    public int getValue ()
    {
        return value;
    }
}

private static class AssetUtils
{
    public static int totalBondAssetValues (Collection <? extends Asset> assets)
    {
        Predicate<? extends Asset> isBondAsset = asset -> Asset.AssetType.BOND.equals(asset.getType());

        return assets.stream().filter(isBondAsset).mapToInt(Asset::getValue).sum();
    }
}

最佳答案

让我们为这两个类型变量命名:

Collection<T> assets;
Predicate<R> isBondAsset;

编译器知道 TRAsset 的子类型但这就是一切必须继续的事情。为了Predicate<R>适用于Collection<T> R必须是 T 的父类(super class)型,但你从来没有这样声明过。

您没有理由声明 isBondAsset带通配符。你应该简单地将其设为 Predicate<Asset> 。然后代码将被编译,因为编译器知道 Asset是满足 ? extends Asset 的任何类型的父类(super class)型

关于generics - java 8谓词类型不匹配,这段代码对我来说似乎合乎逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45443120/

相关文章:

c# - 为什么 C# 4.0 中的类没有泛型变化?

java - 具有泛型的 Java 中的 LinkedList 实现并增强了

c# - 动态和显式通用接口(interface)实现

java - JPA AttributeConverter 被忽略

java-8 - Java 8 文件 readAlllines 映射和减少

java - 我知道 Java 不支持泛型数组,但我不知道如何解决这个问题,以便它可以工作

java - 在流操作中使用方法引用和函数对象之间的区别?

java-8 - nashorn 用绑定(bind)替换 Java.type

java - 使用 Java 流的 MinMaxPriorityQueue

java - 有什么方法可以通过使用泛型来避免 instanceof 吗?