在 Java 泛型中,上限(extends)和下限(super)用于控制泛型类型的范围,核心区别在于允许接收什么类型的泛型参数,以及能往里写 / 能从里读什么类型。
<? extends T>
泛型类型必须是 T 或 T 的子类
List<? extends Number> list;
✅ 可以接收:
List<Integer>
List<Double>
List<Number>
❌ 不能接收:
List<String>
TList<? 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>
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) |
Producer Extends, Consumer Super
extendssuper// 从 src 读(生产者)
public void copy(List<? extends Number> src,
List<? super Number> dest) {
for (Number n : src) {
dest.add(n);
}
}
如果你愿意,我也可以用 画图 / 内存模型 / 面试问答形式再帮你总结一遍。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。