猿问

为什么该行代码中无法在下届通配符中存入父类?

The method add(capture#2-of ? super Integer) in the type List<capture#2-of ? super Integer> is not applicable for the arguments (Number)
    public static void down(List<? super Integer> numberList) {
        Number x = 4;
        numberList.add(x);
    }

add方法报错

倚天杖
浏览 423回答 1
1回答

PIPIONE

对于泛型,要求的是泛型参数一旦被确定就不能改变。<? super Integer> 表示泛型参数将是 Integer 或者其父类,所以你肯定可以用 <? super Integer> 来消费 Integer 或者其子类的对象。但 Number 是 Integer 的父类 —— 我们假设继承关系为 C 继承 B,B 继承 A,而 A、B、C又各自实现了某些接口,那么对于 <? super C> 的泛型参数在运行时有许多可能的选择 —— 并且在你的代码这里(即将 List<? super C> 作为参数),编译期是肯定无法确定这个泛型参数的。所以,编译器干脆直接禁止你添加 C 的父类到泛型容器。
随时随地看视频慕课网APP

相关分类

Java
我要回答