在 Java 中,泛型上下界主要通过 通配符(Wildcard) 来使用,作用是限制泛型参数的类型范围,提高代码的灵活性和安全性。
<? extends T>含义:
表示泛型类型 可以是 T 或 T 的子类
List<? extends Number> list;
表示:
NumberIntegerDoubleFloat
等都可以✅ 适合读取(Producer)
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // ✅ 可以读取
// list.add(1); // ❌ 编译错误
❗ 不能写入(除了 null)
因为编译器不知道具体是 Integer 还是 Double
public void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
<? super T>含义:
表示泛型类型 可以是 T 或 T 的父类
List<? super Integer> list;
表示:
IntegerNumberObject✅ 适合写入(Consumer)
List<? super Integer> list = new ArrayList<Number>();
list.add(1); // ✅ 可以写入
// Integer i = list.get(0); // ❌ 只能当作 Object
public void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
}
<?>List<?> list;
表示:
list.add(null); // ✅
// list.add("a"); // ❌
PECS = Producer Extends, Consumer Super
| 场景 | 使用 |
|---|---|
| 只读取数据 | <? extends T> |
| 只写入数据 | <? super T> |
public <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
表示:
T 必须是 Comparable 的实现类| 写法 | 能读 | 能写 |
|---|---|---|
List<T> |
✅ | ✅ |
List<? extends T> |
✅ | ❌ |
List<? super T> |
❌(Object) | ✅ |
List<?> |
✅(Object) | ❌ |
如果你愿意,我可以:
你想从哪方面深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。