温馨提示×

温馨提示×

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

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

java泛型通配符是什么

发布时间:2026-09-30 19:33:40 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,泛型通配符(Wildcard)是用来表示“未知类型”的特殊符号,主要用在泛型类、泛型接口、泛型方法的声明或使用时,增强代码的灵活性和兼容性。

通配符用问号 ? 表示,主要有三种形式:


1. 无界通配符 ?

表示任意类型。

List<?> list;

含义:

  • list 可以指向任何类型的 List
  • 但不能往里面添加元素(除了 null)
  • 读取时只能当作 Object

示例:

List<?> list = new ArrayList<String>();
Object obj = list.get(0); // 只能当作 Object
// list.add("abc"); // 编译错误

适用场景:

  • 只关心“它是一个泛型容器”,不关心具体类型

2. 上界通配符 ? extends T

表示T 或 T 的子类(上限为 T)

List<? extends Number> list;

含义:

  • 可以接收 Number 及其子类(Integer、Double 等)
  • 只能读,不能写(写入类型不安全)

示例:

List<? extends Number> list = new ArrayList<Integer>();
Number n = list.get(0); // 安全
// list.add(1); // 编译错误

适用场景:

  • 生产者(Producer)→ “读数据”

3. 下界通配符 ? super T

表示T 或 T 的父类(下限为 T)

List<? super Integer> list;

含义:

  • 可以接收 Integer 及其父类(Number、Object)
  • 可以写 Integer,但读出来只能是 Object

示例:

List<? super Integer> list = new ArrayList<Number>();
list.add(1); // 安全
Object o = list.get(0); // 只能当作 Object

适用场景:

  • 消费者(Consumer)→ “写数据”

4. PECS 原则(重要)

Producer Extends, Consumer Super

  • 如果是“获取数据” → 用 ? extends T
  • 如果是“写入数据” → 用 ? super T

示例(Java 源码常见):

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

5. 通配符 vs 泛型参数

<T> void method(List<T> list) { }

vs

void method(List<?> list) { }

区别:

  • <T>:知道具体类型,可在方法内使用 T
  • ?:完全未知,只能当 Object 使用

如果你愿意,我也可以用通俗比喻(如“盒子模型”)或面试题角度再给你讲一遍。

向AI问一下细节

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

AI
助
手