类型擦除问题,ArrayList<Integer>可以存入一个String吗?

1 个回答

  • 姬天
    珍惜所有的不期而遇,看淡所有的不辞而别。
    **正常写法下不行**。 `ArrayList<Integer> list = new ArrayList<>(); list.add("abc");` 会**编译错误**,因为泛型在**编译期**做类型检查。 但由于 **类型擦除**(运行期只有裸类型 `ArrayList`),你**可以绕过**编译期检查(原生类型或反射)把 `String` 塞进去,随后在读取处抛异常: ```java List<Integer> list = new ArrayList<>(); // list.add("abc"); // 编译错误 List raw = list; // 使用原生类型绕过检查(会有 unchecked 警告) raw.add("abc"); // 运行期可加入成功 Integer x = list.get(0); // 这里会抛 ClassCastException: String cannot be cast to Integer ``` 要点: * 泛型的类型约束在**编译期**生效;运行期被擦除为 `Object`(方法返回处编译器会插入强制转换)。 * 数组与泛型对比:数组是**运行期检查**(放错类型抛 `ArrayStoreException`),泛型是**编译期检查**(被绕过时在“读”时抛 `ClassCastException`)。 * 最佳实践:不要用原生类型/反射破坏类型安全,避免 `@SuppressWarnings("unchecked")` 滥用。
    发布于 2025-08-18 03:50 •IP属地 广东
    举报
    评论
    收藏