无界通配符<?>表示“未知但具体”的确定类型,仅用于使用位置;可读取为Object,不可写入非null值,适用于只读或不依赖元素类型的场景。

Java 中的无界通配符 ? 就是用来表示“未知但具体”的类型——它不是泛型变量(比如 T),也不是 Object,而是一种编译时占位符,代表某个**确定但不可知的具体类型**。
为什么说 ? 是“未知但具体”?
比如声明 List<?> list = new ArrayList<String>();,此时 list 的实际类型是 List<String>,只是编译器不让你知道、也不让你假设它是 String。它不是“任意类型混搭”,而是“某一种固定类型,只是被隐藏了”。
? 和 Object 的区别很关键
-
List<?>里的元素只能当作Object读取(get(0)返回Object) - 但你不能往里 add 任何非
null的值——哪怕add(new String("x"))也不行,因为编译器无法验证这个String是否匹配那个“隐藏的具体类型” - 而
List<Object>可以存任意对象,因为它明确要求元素是Object或其子类,类型契约清晰
常见写法与典型用途
-
void print(List<?> list):安全地遍历并打印所有元素(只读) -
boolean isEmpty(List<?> list):调用size()、isEmpty()等不依赖元素类型的方法 -
List<?> result = someMethod();:接收返回泛型类型不确定的方法结果(如某些反射或框架 API)
注意一个易错点
不能用 ? 声明泛型类或方法——比如 class Box<?> 或 <?> void f() 是非法的。它只出现在**使用位置**(变量声明、参数、返回类型),不是定义位置。定义泛型要用 <T>。


















