为什么
Predicate<? super Integer> isGreaterThanZero = num -> num.intValue() > 0;
Run Code Online (Sandbox Code Playgroud)
效劳于
isGreaterThanZero.test( new Integer( 2 ));
Run Code Online (Sandbox Code Playgroud)
并不是
Predicate<? extends Number> isGreaterThanZero = num -> num.intValue() > 0;
Run Code Online (Sandbox Code Playgroud)
我认为它们是相同的,因为它Integer
是-a Number
Mis*_*sha 13
当您声明时Predicate<? extends Number> isGreaterThanZero
,您告诉编译器isGreaterThanZero
是Predicate
由某个未知子类型参数化的Number
.
就编译器而言,它可以是a Predicate<Double>
或a Predicate<BigInteger>
.你能安全地Integer
去往test(Double x)
或去test(BigInteger x)
吗?你不能.唯一可以安全传递给test
方法的Predicate<? extends Number>
是null
.
如果你想isGreaterThanZero
成为一个适用于任何子类型的谓词Number
,你应该声明它Predicate<Number>
.