Java泛型擦除是编译期将类型参数替换为上界(无界则为Object)、插入强制转换、生成无泛型信息字节码的过程;运行时仅存原始类型,导致无法instanceof泛型参数、new T()、获取实际类型或创建泛型数组。

Java 泛型是编译期特性,运行时类型信息被擦除,只保留原始类型(如 List<String> 擦除为 List),所以无法在运行时获取泛型实际参数类型,也不能直接用泛型类型做 instanceof 判断或创建泛型数组。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
擦除的本质是编译器“翻译”而非 JVM 支持
泛型代码在编译阶段由 javac 进行类型检查和类型擦除:
- 所有泛型参数被替换为上界(无界则为 Object)
- 插入必要的类型转换(cast)保证安全性
- 生成的字节码中不包含泛型类型信息(Class 文件里只有原始类型)
例如:List<Integer> 和 List<String> 编译后都是 List,JVM 看不到区别。
典型限制与应对方式
因擦除带来的常见限制及常用解法:
- 不能 new T() → 用 Supplier<T> 或传入 Class<T>
- 不能 instanceof T → 改用 obj instanceof SomeRawType 或借助 TypeToken(如 Gson)在编译期保留类型信息
- 泛型数组创建报错 → 用 new Object[n] + 显式 cast,或改用容器类(如 ArrayList<T>)
- 会丢失)
这支撑了 Spring、Jackson 等框架对泛型的运行时解析能力。

















