流减少不兼容的类型
我正在尝试创建一个包含多个谓词并减少它们的查找程序:
public static Collection findOr( Context pContext, Class pClass, Predicate... pPredicates) { Predicate lReducedPredicate = Arrays.asList(pPredicates).stream().reduce(Predicate::or).orElse(r -> false); return find(pContext, pClass, lReducedPredicate); }
不幸的是我得到以下编译错误:
Predicate lReducedPredicate = Arrays.asList(pPredicates).stream()。reduce(Predicate :: or).orElse(r – > false); 不兼容的类型:谓词不能转换为谓词,其中T是一个类型变量:T扩展在方法findOr(Context,Class,Predicate …)中声明的BusinessInterface,其中CAP#1,CAP#2是新的类型变量:CAP# 1扩展Object super:T从捕获? 超级T CAP#2扩展了Object super:T从捕获? 超级T
我在Eclipse中没有错误,我不知道出了什么问题。
任何帮助真的很感激:)。
解决这个问题的一种方法是使用
public static Collection findOr( Context pContext, Class pClass, Predicate super T>... pPredicates) { Predicate super T> lReducedPredicate = Arrays.asList(pPredicates).stream() .reduce((a,b) -> t -> a.test(t) || b.test(t)).orElse(r -> false); return find(pContext, pClass, lReducedPredicate); }
虽然你不能在Predicate super T>
上调用or
方法Predicate super T>
Predicate super T>
实例与另一个Predicate super T>
Predicate super T>
作为参数,您可以创建相同的函数, or
自己返回,因为将T
实例传递给任一test
方法都是有效的。
你的代码在intellij中适用于我,但不适用于ideone,这很奇怪。
编译器错误的原因是你有效地尝试这样做:
Predicate super T> a = null; Predicate super T> b = null; a.or(b); // Compiler error!
由于a
和b
上都有单独的通配符,编译器无法保证类型边界是兼容的,因为这些通配符不一定相同。
无论如何,尝试这个奇怪的技巧:
Arrays.asList(pPredicates) .stream() .map(a -> a) // Here! .reduce(Predicate::or) .orElse(r -> false);
插入此行允许它转换为与类型约束匹配的类型。