Java泛型容器通过编译期类型检查保障安全,需正确声明具体类型、禁用原始类型、合理使用通配符与类型边界,并避免依赖运行时泛型信息。

Java 中泛型容器本身已提供编译期类型安全,关键在于正确使用泛型声明、避免类型擦除带来的陷阱(如原始类型调用、反射绕过检查),并配合恰当的边界约束与工具方法。
声明时明确泛型类型,禁用原始类型
使用泛型容器必须指定具体类型参数,禁止使用原始类型(raw type),否则会丢失类型检查:
- ✅ 正确:List
list = new ArrayList(); —— 编译器阻止存入Integer - ❌ 危险:List list = new ArrayList(); —— 可 add(42),但取出来强转会抛
ClassCastException
谨慎处理泛型数组与通配符
泛型不可直接创建数组,通配符需区分 ? extends T(只读)和 ? super T(只写):
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 避免
new List—— 编译错误;改用[10] new ArrayList或[10] ArrayList(需压制警告,确保运行时安全)[] arr = (ArrayList []) new ArrayList[10]; - 接收只读集合:用
void printNames(List extends CharSequence> names)—— 可传List或List,但不能add() - 接收可写集合:用
void addInts(List super Integer> target)—— 可传List或List,允许add(123)
对泛型方法做类型约束(bounded type parameters)
当操作依赖元素行为时,用 等限定,既保证类型安全又支持调用特定方法:
-
public
double sum(List —— 编译期确保所有元素是numbers) { ... } Number子类,可调用doubleValue() - 若传入
List,编译失败,不等到运行时报错
避免运行时类型擦除导致的误判
泛型信息在运行时被擦除,不能用 instanceof 检查泛型类型,也不要用 getClass() 判断实际泛型参数:
- ❌ 错误:
if (list instanceof List—— 语法不合法,编译报错) - ❌ 无意义:
list.getClass() == ArrayList.class—— 只能判断容器实现类,无法得知泛型实参 - ✅ 替代方案:若需运行时类型信息,显式传入
Class参数,例如T fromJson(String json, Class type)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










