在 Java 中,extends 用于泛型边界(Generic Bounds),主要作用是限制泛型类型的取值范围。常见有 3 种用法,下面用通俗示例说明。
? extends T含义:
表示“未知类型,但必须是 T 或 T 的子类”。
List<? extends Number> list;
✅ 可以接收:
List<Integer> a;
List<Double> b;
❌ 不能接收:
List<String>
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // ✅ 可以读
list.add(1); // ❌ 编译错误
原因:
编译器不知道具体是 Integer 还是 Double,为了类型安全,禁止写入。
✅ 适用场景:只读遍历
void print(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
T extends Bound含义:
限定泛型参数 T 必须是某个类或其子类。
class Box<T extends Number> {
T value;
}
✅ 合法:
Box<Integer> b1;
Box<Double> b2;
❌ 非法:
Box<String> b3;
<T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
<T extends Number & Comparable<T>> void test(T t) {}
规则:
| 写法 | 含义 | 能否写入 |
|---|---|---|
T extends Number |
T 是 Number 或其子类 | ✅ |
? extends Number |
未知子类 | ❌ |
? super Number |
未知父类 | ✅(部分) |
extends 读,super 写(PECS 原则)
如果你愿意,我也可以结合 PECS、泛型擦除、或者实际项目场景 再细讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。