Java中?是泛型通配符,代表编译时未知的引用类型;它支持读取(推断为Object)、调用Object方法及集合非泛型方法,但禁止add/set非null元素,仅允许写入null。

Java 中的 ? 就是泛型通配符,它不表示某个具体类型,而是代表“编译时未知的引用类型”。它不是 Object,也不是泛型变量,只是一个占位符,告诉编译器:“这里可以是任意一种引用类型,但我不关心具体是什么”。
为什么需要 ? —— 因为泛型没有继承关系
比如 List 和 List 在 Java 中是两个完全无关的类型,哪怕 String 是 Object 的子类。这种“泛型不变性”导致无法直接赋值或传参。而 List> 就像一个通用适配器,能同时接收 List、List、List 等任何具体类型的 List。
声明为 List> 后能做什么?
- ✅ 可以读取元素,但类型被统一推断为 Object(因为编译器无法确认实际类型)
- ✅ 可以调用所有 Object 类的方法,如 toString()、equals()、hashCode()
- ✅ 可以调用泛型集合本身的非泛型方法,如 size()、isEmpty()、clear()、iterator()
- ❌ 不能 add() 任何非 null 元素(连 new String("x") 都不行),因为编译器无法验证类型安全
- ❌ 不能 set() 某个位置的元素(同理,类型不确定)
- ✅ 唯一允许写入的是 null(null 属于所有引用类型的子类型)
典型使用场景
当你写一个工具方法,只关心“它是个列表”,而完全不需要知道里面装的是字符串、数字还是自定义对象时,就该用 ?:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 打印所有元素(只需 toString())
- 统计长度或判空
- 遍历并做类型无关的操作(如日志记录、序列化前检查)
- 作为字段或返回值类型,表达“持有某种泛型结构,但不操作其内容”
注意:? ≠ Object
List 表示“这个列表明确只能存 Object 或其子类实例”,你可以往里 add(new Date())、add("hello");而 List> 表示“这个列表原本是某一种确定类型(比如 List
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










