Integer extends Number 但不能对 <?扩展 Number> 为 Integer

Integer extends Number but can't operate on <? extends Number> with Integer

Integer extends Number 那么为什么我会在底部出现错误?

interface Predicate<T> {
   public abstract boolean check(T t);
}

Predicate<? extends Number> predUpper = null;

predUpper.check(new Integer(73));

错误:Predicate 类型中的方法 check(capture#6-of ? extends Number) 不适用于参数 (Integer)

我已阅读:Method in the type Map<String,capture#1-of ? extends Object> is not applicable and Difference between <? super T> and <? extends T> in Java

由于 Predicate 消耗 Integer,您应该这样做:

Predicate<? super Integer> predUpper //Solution 1

或者只是:

Predicate<Number> predUpper //Solution 2

但是,这些方法存在差异:

  • 来自 "Solition 1" 的类型参数 <? super Integer 表示 整个家族 Integer 的超类型(包括 Integer).

  • 来自 "Solution 2" 的类型参数 <Number> 表示 Number 接口的子 class。既然Integer是这样的,这里就适用了。

更多信息:

  • What is PECS?