这段代码对我来说似乎合乎逻辑,为什么编译器提示谓词 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;
编译器知道 T
和R
是 Asset
的子类型但这就是一切必须继续的事情。为了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/