在 Java 中,泛型边界(Generic Bounds)用于控制泛型类型参数可以取哪些类型。主要通过 extends 和 super 来设置,分别用于上界和下界,并结合通配符 ? 使用。
下面系统地说明。
<T extends Number>
表示:T 只能是 Number 或其子类(如 Integer、Double)。
示例:
public class Box<T extends Number> {
private T value;
public double doubleValue() {
return value.doubleValue(); // Number 的方法可用
}
}
✅ 合法:
Box<Integer> b1;
Box<Double> b2;
❌ 非法:
Box<String> b3; // 编译错误
<T extends A & B & C>
<T extends Comparable<T> & Serializable>
List<? extends Number>
表示:
List<Integer>List<Double>List<? extends Number> list = new ArrayList<Integer>();
// list.add(1); // 编译错误
Number n = list.get(0); // OK
✅ 适合读取
List<? super Integer>
表示:
List<Integer>List<Number>List<Object>List<? super Integer> list = new ArrayList<Number>();
list.add(1); // OK
Object o = list.get(0); // 只能当 Object 用
✅ 适合写入
List<?>
等价于:
List<? extends Object>
只能:
ObjectProducer → Extends, Consumer → Super
? extends T? super T// 复制集合
public static <T> void copy(
List<? super T> dest,
List<? extends T> src) {
for (T item : src) {
dest.add(item);
}
}
public static <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
❌ 不能实例化泛型
new T(); // 不行
❌ 不能用基本类型
Box<int> b; // 错误,必须用 Integer
| 写法 | 含义 | 可读 | 可写 |
|---|---|---|---|
<T extends A> |
T 是 A 或子类 | ✅ | ✅ |
? extends T |
T 或子类 | ✅ | ❌ |
? super T |
T 或父类 | ❌(Object) | ✅ |
? |
任意类型 | ✅(Object) | ❌ |
如果你有具体使用场景(如集合、接口设计、回调函数),我可以给你更贴切的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。