java - 为什么 <? extends Number> 不适用于 Integer?

标签 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 is-a Number

最佳答案

当你声明Predicate<? extends Number> isGreaterThanZero ,你告诉编译器 isGreaterThanZeroPredicateNumber 的一些未知子类型参数化.

就编译器所知,它可能是一个 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/

相关文章:

java - 使用访问策略向用户配置 Active Directory 帐户时出错

java - CUPS - Cups4j - 定义页面/媒体大小

java - 我无法为 AsyncTask 的结果参数设置上限

c# - 从类型参数创建继承类

java - 像在 SQL 中使用 Java lambda 一样对对象进行分组和求和?

Java 8 HashMap KeySet() 输出不同于 Java 7

java - 检查三个 boolean 值的最快且最易读的方法

调整大小时的 JavaFX 布局行为

c# - 具有新类型约束的通用构造函数

java - 如何根据谓词有效地将对象从一个 Java 集合传输到另一个集合?