温馨提示×

温馨提示×

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

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

java泛型通配符怎么用

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

Java 泛型通配符(Wildcard)主要用于泛型类型不确定或不关心具体类型的场景,常见有三种形式:


1. 无界通配符 ?

表示“任意类型”。

List<?> list;

特点

  • 可以读取为 Object
  • 不能写入(除了 null
List<?> list = new ArrayList<String>();
Object o = list.get(0); // OK
// list.add("abc"); // 编译错误

使用场景

  • 只关心“这是一个 List”,不关心元素类型
  • 如打印集合内容
public static void printList(List<?> list) {
    for (Object o : list) {
        System.out.println(o);
    }
}

2. 上界通配符 ? extends T

表示“T 或其子类”。

List<? extends Number> list;

特点

  • 可以读取为 T
  • 不能写入(类型不安全)
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // OK
// list.add(1); // 编译错误

使用场景(生产者 / 读)

  • 从集合中“读取”数据
public static double sum(List<? extends Number> list) {
    double s = 0;
    for (Number n : list) {
        s += n.doubleValue();
    }
    return s;
}

3. 下界通配符 ? super T

表示“T 或其父类”。

List<? super Integer> list;

特点

  • 可以写入 T 及其子类
  • 读取只能是 Object
List<? super Integer> list = new ArrayList<Number>();
list.add(1); // OK
// Integer i = list.get(0); // 编译错误
Object o = list.get(0); // OK

使用场景(消费者 / 写)

  • 向集合中“写入”数据
public static void addNumbers(List<? super Integer> list) {
    list.add(1);
    list.add(2);
}

4. PECS 原则(重要)

Producer Extends, Consumer Super

  • ? extends T
  • ? super T
// 从 src 读,写入 dest
public static <T> void copy(
        List<? super T> dest,
        List<? extends T> src) {
    for (T item : src) {
        dest.add(item);
    }
}

5. 通配符 vs 泛型方法

  • List<?>:类型未知
  • <T> List<T>:类型已知并可推导
// 泛型方法
public static <T> void print(List<T> list) { }

// 通配符
public static void print(List<?> list) { }

6. 常见误区

❌ 不能 new 通配符类型

List<?> list = new ArrayList<?>(); // 错误

✅ 可以 new 具体类型

List<?> list = new ArrayList<String>();

如果你愿意,我也可以结合 集合 / 接口设计 / 源码示例(如 Collections.sort) 来具体讲。

向AI问一下细节

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

AI