温馨提示×

温馨提示×

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

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

super泛型下限如何理解

发布时间:2026-09-30 17:53:35 来源:亿速云 阅读:95 作者:小樊 栏目:编程语言

在 Java 泛型中,“下限(lower bound)”通常指的是 ? super T 这种通配符写法,也叫下界通配符(lower bounded wildcard)。


一、什么是 ? super T

List<? super Integer> list;

意思是:

list 可以指向一个元素类型是 Integer 或其父类(祖先类)的 List

例如:

List<? super Integer> list;

list = new ArrayList<Integer>();   // ✅
list = new ArrayList<Number>();    // ✅
list = new ArrayList<Object>();    // ✅

但不能是:

list = new ArrayList<String>();    // ❌ String 不是 Integer 的父类

二、为什么叫“下限”

  • ? super Integer
  • Integer 是类型范围的下限
  • 允许的类型是:Integer 及其所有父类(往上走)

类比:

“至少是 Integer 这一层,再往上都可以”


三、能做什么,不能做什么(重点)

✅ 可以【写入】(往里放)

List<? super Integer> list = new ArrayList<Number>();
list.add(10);        // ✅ 可以,因为 Integer 一定是合法元素
list.add(new Integer(5)); // ✅

原因:
不管 list 实际是 Integer / Number / Object,Integer 一定能被放进去


❌ 不能【安全读取为具体类型】

Integer i = list.get(0); // ❌ 编译错误

为什么?

  • list 可能是 List<Object>
  • 取出的元素类型不确定,只能是 Object

只能这样:

Object o = list.get(0); // ✅

四、记忆口诀(非常重要)

PECS 原则

  • Producer → extends(上界)
  • Consumer → super(下界)

解释:

  • 如果是生产者(只往外拿)→ 用 ? extends T
  • 如果是消费者(只往里放)→ 用 ? super T

五、经典例子(Collections.copy)

public static <T> void copy(
    List<? super T> dest,
    List<? extends T> src
)
  • src:生产 T(上界)
  • dest:消费 T(下界)

✅ 非常安全、非常经典


六、一句话总结

? super T 表示“T 或 T 的父类”,适合往里写,不适合往外读。

如果你愿意,我也可以用图或和 ? extends 对比的方式再讲一遍。

向AI问一下细节

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

AI
助
手