我正在浏览 Java 8 中引入的 Predicate 类,它是功能接口。Predicate 类内部有一个方法 and ,用于将多个谓词组合为一个。
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
我已经阅读了 Java 中 PECS 的概念,但仍然不明白为什么在 Predicate 的情况下我们使用? super T
. java程序员如何决定它将是消费者而不是生产者。
我的意思是为什么不应该允许出现编译错误的行:
public class PredicateExample {
public static void main(String[] args) {
Predicate<Number> pred = n -> n.intValue() > 2;
Predicate<Integer> predInt = n -> n > 3;
//Compile error
//pred.and(predInt);
Predicate<Object> predObj = o -> Integer.parseInt(o.toString()) > 4;
pred.and(predObj); //Valid statement
Number n = new Integer(100);
System.out.println(pred.and(predObj).test(10));
System.out.println(predInt.and(pred).test(10));
//Compile error
//System.out.println(pred.and(predInt).test(10));
}
}