为什么
Predicate<? super Integer> isGreaterThanZero = num -> num.intValue() > 0;
适用于
isGreaterThanZero.test( new Integer( 2 ));
而不是
Predicate<? extends Number> isGreaterThanZero = num -> num.intValue() > 0;
我认为它们是相同的,因为Integer
是-a Number
答案 0 :(得分:13)
当您声明Predicate<? extends Number> isGreaterThanZero
时,您告诉编译器isGreaterThanZero
是由Predicate
的某个未知子类型参数化的Number
。
就编译器而言,它可以是Predicate<Double>
或Predicate<BigInteger>
。你能安全地将Integer
传递给test(Double x)
或test(BigInteger x)
吗?你不能。您可以安全地传递给test
Predicate<? extends Number>
方法的唯一方法是null
。
如果您希望isGreaterThanZero
成为适用于Number
任何子类型的谓词,则应将其声明为Predicate<Number>
。