为什么<! - ?扩展数字 - >不适用于整数?

时间:2016-06-03 02:36:41

标签: java generics java-8

为什么

Predicate<? super Integer> isGreaterThanZero = num -> num.intValue() > 0;

适用于

isGreaterThanZero.test( new Integer( 2 ));

而不是

Predicate<? extends Number> isGreaterThanZero = num -> num.intValue() > 0;

我认为它们是相同的,因为Integer 是-a Number

1 个答案:

答案 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>