我想创建一个简单的通用方法来计算应用过滤器后的数字。
static int count(Collection < ? extends Number > numbers, Predicate < ? extends Number > predicate) {
return numbers.stream().filter(predicate).count();
}
它给了我这个错误:
不兼容的类型:谓词无法转换为
Predicate<? super CAP#2>
其中CAP#1,CAP#2是新的类型变量:CAP#1从捕获中扩展数字?扩展数字
CAP#2从捕获数量扩展数量?扩展数字
答案 0 :(得分:6)
你不能像这样使用通配符,因为第二个参数取决于第一个!你的版本意味着你想要一个苹果集合然后应用香蕉谓词。
换句话说:只需声明一个not-unkown类型参数;并使用:
static <T extends Number> long count(Collection<T> numbers, Predicate <T> predicate) {
对于记录:count()
返回长结果;因此我相应地改变了返回类型。如果那不是你想要的,你必须转换为int,但要忍受(潜在的)信息丢失。