温馨提示×

温馨提示×

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

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

泛型通配符是什么

发布时间:2026-10-21 09:37:44 来源:亿速云 阅读:90 作者:小樊 栏目:编程语言

泛型通配符(Generic Wildcards)是 Java 泛型中用来表示“未知类型”的特殊符号,主要用在泛型类的引用、方法参数中,用来提高代码的灵活性。

最常见的通配符有三种:


1. 无界通配符 ?

表示任意类型。

List<?> list;

含义:

  • 可以指向任何 List(如 List<String>、List<Integer>)
  • 但不能往里面添加元素(除了 null)
List<?> list = new ArrayList<String>();
// list.add("abc"); // 编译错误

常用于:只读取、不写入的场合。


2. 上界通配符 ? extends T

表示T 或 T 的子类(上限是 T)。

List<? extends Number> list;

含义:

  • 可以接收 List<Integer>、List<Double> 等
  • 只能读,不能写(写只能写 null)
List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // OK
// list.add(1); // 编译错误

常用于:生产者(Producer),即“往外读数据”。


3. 下界通配符 ? super T

表示T 或 T 的父类(下限是 T)。

List<? super Integer> list;

含义:

  • 可以接收 List<Integer>、List<Number>、List<Object>
  • 可以写 Integer 及其子类
  • 读出来只能是 Object
List<? super Integer> list = new ArrayList<Number>();
list.add(1); // OK
Object o = list.get(0); // OK

常用于:消费者(Consumer),即“往里写数据”。


4. PECS 原则(重要)

Producer Extends, Consumer Super

  • 如果是生产者(提供数据) → 用 ? extends T
  • 如果是消费者(接收数据) → 用 ? super T

示例:

public void copy(List<? extends Number> src,
                 List<? super Number> dest) {
    for (Number n : src) {
        dest.add(n);
    }
}

5. 通配符 vs 泛型参数

<T> void method(List<T> list)      // 明确一个类型 T
void method(List<?> list)          // 不关心具体类型
  • T 可以在方法内部继续使用
  • ? 只是“占位未知类型”,不能当作具体类型使用

如果你愿意,我也可以用通俗比喻(如盒子/容器)或面试题角度再讲一遍。

向AI问一下细节

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

AI
助
手