泛型与ArrayList结合的核心目标是实现编译期类型安全,通过声明时绑定具体类型(如ArrayList)、禁止裸类型、添加匹配类型元素、读取无需强制转换,确保存取遍历均面向单一明确类型,避免运行时ClassCastException。

泛型和 ArrayList 结合,核心目标是让每次存、取、遍历都只面向一种明确类型,编译器在写代码时就拦住类型错误,而不是等运行出 ClassCastException 才发现。
声明时绑定具体类型
创建 ArrayList 时必须指定泛型参数,比如 ArrayList 或 ArrayList。这一步不是可选项,而是类型安全的起点。
- 用包装类代替基本类型:写
ArrayList,不能写ArrayList - 自定义类直接使用类名:如
ArrayList,前提是Order已正确定义 - 避免裸类型(raw type):不写
ArrayList list = new ArrayList(),它会失去所有泛型保护
添加元素必须匹配类型
add 方法只接受声明类型或其子类的实例。编译器会检查你传进去的对象是不是合法的。
- 正确:
list.add(new User("Alice", 28))(当 list 是ArrayList) - 错误:
list.add("hello")或list.add(123)—— 编译直接报错 - 注意构造对象再添加:不能写
list.add("name", 25),ArrayList 的 add 只接收一个参数
读取数据无需强制转换
因为类型已由泛型锁定,get、iterator.next()、for-each 中拿到的变量就是你声明的类型,直接用,不 cast。
- 以前非泛型写法:
String s = (String) list.get(0) - 现在:
String s = list.get(0)—— 类型已知,自动推导 - 遍历时也一样:
for (User u : userList) { u.getName(); },u 就是 User 类型
泛型擦除不影响运行时安全
Java 在编译后会擦除泛型信息(比如 ArrayList 变成原始 ArrayList),但这不削弱安全性。
- 擦除发生在编译完成之后,所有类型检查已在编译期做完
- add、get 等方法内部有隐式类型检查逻辑,确保不会混入非法对象
- 第三方 SDK 返回
List这类嵌套泛型,照样能逐层约束类型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











