java中用?接收任意泛型容器,核心是支持安全的只读操作(如size()、contains()、遍历),禁止添加元素或调用具体类型方法,适用于不依赖元素具体类型的通用逻辑。

Java 中用 ? 接收任意泛型容器,核心是让方法能安全处理不同具体类型的集合(比如 List<string></string>、List<integer></integer>、Set<date></date>),但只允许读取或类型无关的操作。
什么时候该用 ?
当你写的逻辑不依赖元素的具体类型,只调用 Object 层的方法(如 toString()、equals())或集合本身的通用操作(如 size()、isEmpty()、clear())时,? 就很合适。
- 想写一个通用打印方法,不管传进来的是字符串列表还是数字列表
- 要判断某个集合是否为空、是否包含某对象(
contains()参数是Object,没问题) - 需要遍历并做统一处理,比如日志记录、序列化前检查
? 能做什么、不能做什么
声明为 List> 或 Collection> 后,编译器会严格限制操作,确保类型安全:
- ✅ 安全操作:调用
size()、isEmpty()、contains(obj)、iterator()、stream()、get(i)(返回Object) - ✅ 清空操作:
clear()可以用,它不涉及类型擦除后的元素插入 - ❌ 禁止添加:
add(e)、addAll(c)、set(i, e)全部编译报错(除null外) - ❌ 无法直接调用元素特有方法:比如
get(0).length()或get(0).intValue(),必须先强制转型,且失去泛型保护
典型写法示例
下面是一个标准、安全的只读遍历方法:
public static void printAll(Collection> collection) {
for (Object item : collection) {
System.out.println(item); // 只调用 Object.toString()
}
}
它可以接收:
printAll(Arrays.asList("a", "b"))printAll(Arrays.asList(1, 2, 3))printAll(Collections.singleton(new File("test.txt")))
所有调用都通过编译,运行时行为一致——因为底层没做任何类型假设。
常见误区提醒
别把 List> 和裸类型(List)混用:
-
List>是类型安全的,编译器帮你挡住非法写入 -
List(没泛型)是“原始类型”,绕过泛型检查,可能引发运行时ClassCastException - 也别试图用
?声明变量后往里塞数据——它不是占位符,而是“未知且固定”的类型,编译器不允许你破坏这个未知性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











