List<?>使用

因为使用了?,所以程序编译器并不知道其内部存储的是什么类型

List<?>的正确使用和错误使用两种情况。简单一句话:可以使用get访问元素,但不能使用add添加元素。

转载于:https://www.cnblogs.com/stitchZsx/p/9850706.html

### Java 中 `List` 与 `List<?>` 的区别 在 Java 中,`List` 和 `List<?>` 是泛型机制中的两种不同表示方式,它们的含义和用途有显著的区别。 #### 1. **`List`** `List` 表示一个未指定泛型类型的列表。它是一个原始类型(Raw Type),即没有指定具体的类型参数。使用原始类型时,编译器不会进行类型检查,可能会导致运行时的 `ClassCastException` 或其他问题[^4]。 ```java List rawList = new ArrayList(); rawList.add("String"); rawList.add(123); // 编译通过,但可能导致运行时错误 ``` - 原始类型的 `List` 不推荐使用,因为它会跳过泛型的安全性检查。 - 在现代 Java 编程中,应尽量避免使用原始类型,以确保代码的类型安全。 #### 2. **`List<?>`** `List<?>` 表示一个包含未知类型的列表。这里的 `?` 是通配符(Wildcard),表示具体类型是未知的,但必须是某种确定的类型。例如,`List<?>` 可以指向 `List<String>`、`List<Integer>` 或其他任何具体的 `List<T>` 实例[^1]。 ```java List<?> wildcardList = new ArrayList<String>(); wildcardList = new ArrayList<Integer>(); ``` - 使用 `List<?>` 时,无法向列表中添加元素(除了 `null`),因为编译器不知道列表的确切类型。 - 可以从列表中读取元素,但只能作为 `Object` 类型处理,因为具体类型未知。 ```java List<?> list = Arrays.asList("Hello", "World"); Object obj = list.get(0); // 编译通过,返回值为 Object list.add("Test"); // 编译错误:无法添加元素 list.add(null); // 编译通过,允许添加 null ``` #### 3. **主要区别** | 特性 | `List` | `List<?>` | |---------------------|----------------------------------|------------------------------------------| | 泛型支持 | 不支持 | 支持未知类型 | | 类型安全性 | 无 | 提供部分类型安全性 | | 添加元素 | 允许添加任意类型(不安全) | 仅允许添加 `null` | | 获取元素 | 返回 `Object`,可能引发异常 | 返回 `Object`,但更安全 | | 使用场景 | 旧代码兼容或特殊需求 | 需要操作未知类型但确保类型安全的场景 | #### 4. **代码示例** 以下是一个对比 `List` 和 `List<?>` 的示例: ```java import java.util.*; public class ListExample { public static void main(String[] args) { // 原始类型 List List rawList = new ArrayList(); rawList.add("String"); rawList.add(123); // 编译通过,但可能导致运行时错误 // 未知类型 List<?> List<?> wildcardList = new ArrayList<String>(); wildcardList = new ArrayList<Integer>(); Object obj = wildcardList.get(0); // 编译通过,返回值为 Object wildcardList.add(null); // 编译通过,允许添加 null // wildcardList.add("Test"); // 编译错误:无法添加元素 } } ``` ### 结论 `List` 是原始类型,缺乏类型安全性,而 `List<?>` 是带有未知类型参数的泛型列表,提供了更高的类型安全性。在现代 Java 开发中,应优先使用泛型形式(如 `List<?>` 或 `List<T>`),以减少潜在的运行时错误[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值