为什么
Predicate<? super Integer> isGreaterThanZero = num -> num.intValue() > 0;
为
工作isGreaterThanZero.test( new Integer( 2 ));
而不是
Predicate<? extends Number> isGreaterThanZero = num -> num.intValue() > 0;
我认为它们是相同的,因为 Integer
is-a Number
最佳答案
当你声明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>
.
关于java - 为什么 <? extends Number> 不适用于 Integer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37605084/