You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java通配符<? super Number>指向超类还是子类?附代码编译疑问

关于Java泛型下界通配符<? super T>的困惑与澄清

问题背景

  • 此问题曾被判定为PECS问题的重复项而关闭,但PECS作为助记符弊大于利——人们往往死记硬背却未理解深层逻辑,因此请求重开。

理解更新

从@rzswitzerloot的解释中我理解到:通配符仅指代集合中元素的类型,并不意味着可以向集合中添加通配符类型——实际上只能添加该类型的子类(包括自身,此处为B)。

核心困惑

我对通配符<? super Number>到底指代Number的超类(比如Object)还是子类(比如Integer)感到困惑。在Jeanne Boyarsky与Scott Selikoff所著的《Java OCP 17开发者完全学习指南》(第9章 集合与泛型)中提到:

泛型允许指定通配符。<?>是无界通配符,表示任意类型。<? extends Object>是上界通配符,表示Object或其子类的任意类型。<? extends MyInterface>表示实现MyInterface的任意类型。
<? super Number>是下界通配符,表示Number或其超类的任意类型。尝试向无界或上界通配符的列表中添加元素会导致编译错误。

我理解<? super B>应该代表B的超类(比如A),但为何以下代码无法通过编译?

代码示例

import java.util.ArrayList;
import java.util.List;

public class Bewildered {
    static class A {}
    static class B extends A {}
    static class C extends B {}

    public static void main(String[] args) {
        List<? super B> listBs = new ArrayList<>();
        listBs.add(new A());
    }
}

编译错误信息

java: incompatible types: Bewildered.A cannot be converted to capture#1 of ? super Bewildered.B

内容的提问来源于stack exchange,提问作者likejudo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:10:23