温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java泛型上限下限区别

发布时间:2026-09-10 04:53:14 来源:亿速云 阅读:101 作者:小樊 栏目:编程语言

在 Java 泛型中,上限(extends)下限(super)用于控制泛型类型的范围,核心区别在于允许接收什么类型的泛型参数,以及能往里写 / 能从里读什么类型


一、泛型上限(上界通配符)

写法

<? extends T>

含义

泛型类型必须是 T 或 T 的子类

示例

List<? extends Number> list;

✅ 可以接收:

List<Integer>
List<Double>
List<Number>

❌ 不能接收:

List<String>

读 / 写规则(重点)

  • 可以读,读取出来的类型至少是 T
  • 不能写(除了 null)
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // ✅ 安全
list.add(1);            // ❌ 编译错误

原因:编译器不知道具体是 Integer 还是 Double,为避免类型不安全,禁止写入。


二、泛型下限(下界通配符)

写法

<? super T>

含义

泛型类型必须是 T 或 T 的父类

示例

List<? super Integer> list;

✅ 可以接收:

List<Integer>
List<Number>
List<Object>

❌ 不能接收:

List<Double>

读 / 写规则

  • 可以写 T 及其子类
  • 读只能当作 Object
List<? super Integer> list = new ArrayList<Number>();
list.add(1);          // ✅ 安全
Object o = list.get(0); // ✅ 只能当 Object

三、对比总结表

特性 <? extends T> <? super T>
含义 T 或 T 的子类 T 或 T 的父类
适合场景 读取数据 写入数据
能否写入 ❌ 基本不能 ✅ 可以写 T
读取类型 T Object
典型用途 生产者(Producer) 消费者(Consumer)

四、PECS 原则(重要)

Producer Extends, Consumer Super

  • Producer(产出数据) → 用 extends
  • Consumer(消费数据) → 用 super

示例

// 从 src 读(生产者)
public void copy(List<? extends Number> src,
                 List<? super Number> dest) {
    for (Number n : src) {
        dest.add(n);
    }
}

五、一句话记忆

  • extends:限制最大类型(只读)
  • super:限制最小类型(可写)

如果你愿意,我也可以用 画图 / 内存模型 / 面试问答形式再帮你总结一遍。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI