温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java泛型边界如何设置

发布时间:2026-09-10 05:19:17 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,泛型边界(Generic Bounds)用于控制泛型类型参数可以取哪些类型。主要通过 extendssuper 来设置,分别用于上界下界,并结合通配符 ? 使用。

下面系统地说明。


一、上界(Upper Bound)

1. 限定类型参数必须是某类或其子类

<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; // 编译错误

2. 多重边界(&)

<T extends A & B & C>
  • 只能有一个类(若有,必须放最前)
  • 其余必须是接口
<T extends Comparable<T> & Serializable>

3. 通配符上界(? extends)

List<? extends Number>

表示:

  • 可以是 List<Integer>
  • 可以是 List<Double>
  • 不能添加元素(除 null)
List<? extends Number> list = new ArrayList<Integer>();
// list.add(1); // 编译错误
Number n = list.get(0); // OK

✅ 适合读取


二、下界(Lower Bound)

1. 通配符下界(? super)

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>

只能:

  • 读取为 Object
  • 不能写入(除 null)

四、PECS 原则(重要)

Producer → Extends, Consumer → Super

  • Producer(生产数据):用 ? extends T
  • Consumer(消费数据):用 ? 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)

如果你有具体使用场景(如集合、接口设计、回调函数),我可以给你更贴切的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI