在 Java 泛型中,“下限(lower bound)”通常指的是 ? super T 这种通配符写法,也叫下界通配符(lower bounded wildcard)。
? super TList<? 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 IntegerInteger 是类型范围的下限类比:
“至少是 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<Object>Object只能这样:
Object o = list.get(0); // ✅
PECS 原则
- Producer → extends(上界)
- Consumer → super(下界)
? extends T? super Tpublic static <T> void copy(
List<? super T> dest,
List<? extends T> src
)
src:生产 T(上界)dest:消费 T(下界)✅ 非常安全、非常经典
? super T表示“T 或 T 的父类”,适合往里写,不适合往外读。
如果你愿意,我也可以用图或和 ? extends 对比的方式再讲一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。