当前位置: 代码网 > it编程>编程语言>Java > JAVA泛型通配符的上界和下界的具体使用

JAVA泛型通配符的上界和下界的具体使用

2025年06月30日 Java 我要评论
在 java 泛型中,通配符(wildcard) 用于表示未知的类型。为了增强灵活性和安全性,java 提供了对通配符的上界(upper bound) 和 下界(lower bound) 的限制。一、

在 java 泛型中,通配符(wildcard) 用于表示未知的类型。为了增强灵活性和安全性,java 提供了对通配符的上界(upper bound)下界(lower bound) 的限制。

一、通配符概述

  • 基本通配符:?
    • 表示未知类型。
    • 示例:list<?> 表示一个元素类型未知的列表。

⚠️ 使用 list<?> 后,不能向其中添加除 null 外的任何元素(因为编译器不知道具体类型),但可以读取为 object。

二、通配符的上界(upper bound wildcard)

语法:

? extends t
  • 表示“某个未知类型,它是 t 的子类型”。
  • 适用于“只读不写”的场景。

示例:

list<? extends number> list = new arraylist<integer>();

可以读取元素为 number 类型:

number num = list.get(0);

❌ 不允许添加元素(除了 null):

list.add(123); // 编译错误!不知道实际类型是 integer 还是 double 等

用途:

  • 当你只需要从集合中读取数据,并希望它能接受多种子类型时使用。

三、通配符的下界(lower bound wildcard)

语法:

? super t
  • 表示“某个未知类型,它是 t 的父类型”。
  • 适用于“只写不读”的场景。

示例:

list<? super integer> list = new arraylist<number>();

可以添加 integer 类型的对象:

list.add(10);

❌ 读取时只能作为 object 类型:

object obj = list.get(0); // 无法知道具体是 number、object 还是其他父类

用途:

  • 当你需要将某种具体类型的数据写入集合,并且该集合的类型必须是它的父类时使用。

四、对比总结

通配符形式含义可否添加元素可否读取元素典型用途
?任意类型✅(作为 object)通用只读集合
? extends tt 或其子类✅(作为 t)读取特定类型的集合
? super tt 或其父类✅(作为 object)写入特定类型的集合

小技巧:pecs 原则(producer extends, consumer super)

这是理解泛型通配符的经典原则:

  • producer(生产者) → 使用 extends(只读)
  • consumer(消费者) → 使用 super(只写)

示例代码:

public static void copy(list<? extends number> source,
                        list<? super number> dest) {
    for (number number : source) {
        dest.add(number); // 写入到 dest
    }
}

总结

  • 使用 ? extends t 来限定上界,适合读操作。
  • 使用 ? super t 来限定下界,适合写操作。
  • 结合 pecs 原则,可以更安全地使用泛型集合。

到此这篇关于java泛型通配符的上界和下界的具体使用的文章就介绍到这了,更多相关java泛型通配符上界和下界内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网! 

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com