泛型集合通过编译期类型检查避免运行时ClassCastException:限定元素类型后,add非法类型被编译器拦截,get返回正确类型无需强转,消除转型失败风险。
泛型集合如何避免运行时 ClassCastException
没有泛型时,ArrayList 存什么都能收,取出来得手动强转:(String) list.get(0)。一旦误存了 Integer,运行到这行就抛 ClassCastException——错误被推迟到运行期,难定位。
泛型把类型检查提前到编译期:ArrayList 只允许加 String,编译器直接拦截 list.add(123) 这类操作。不是“防止出错”,而是让错在写完就暴露。
- 编译器生成桥接方法和类型擦除后的字节码,但校验逻辑全程参与
- IDE(如 IntelliJ)能实时高亮不匹配的 add / get 调用
- 注意:反射绕过泛型(如
list.getClass().getMethod("add", Object.class).invoke(list, 42))仍可破坏类型安全
get() 方法不再需要显式强制转换
以前写 String s = (String) list.get(i),括号不是装饰,是必须的生存操作;现在 ArrayList 的 get() 返回类型就是 String,直接赋值即可。
这不只是少敲几个字符——它消除了“转型失败”这个独立错误源,也降低了维护成本:改类型时,所有相关 get() 调用会随泛型参数自动适配,不用逐个翻找强转语句。
立即学习“Java免费学习笔记(深入)”;