泛型擦除的作用
泛型擦除是为了让:用新编译器(支持泛型)编译的新代码(包含泛型语法),生成的字节码能够运行在老版本JVM上。
关键区别
错误理解:
- 老JVM直接运行新代码(包含泛型语法的.java文件)
正确理解:
// 步骤1:用Java 5.0+编译器编译新代码
javac -source 1.5 MyClass.java // 编译包含泛型的.java文件// 步骤2:生成的字节码(.class文件)在老JVM上运行
java -version 1.4 MyClass // 运行编译后的.class文件
实际流程
// 开发者写的源代码(新代码,包含泛型)
public class Test {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("hello");String item = list.get(0);}
}// 编译后的字节码(泛型被擦除)
public class Test {public static void main(String[] args) {List list = new ArrayList(); // 泛型擦除list.add("hello");String item = (String) list.get(0); // 编译器插入转换}
}
验证这个理解
# 实际操作流程:
# 1. 用Java 8编译器编译
javac -source 8 -target 8 MyClass.java# 2. 查看生成的字节码(没有泛型信息)
javap -c MyClass# 3. 用Java 1.4 JVM运行(如果可以)
java -version:1.4 MyClass
为什么这样设计
- 开发体验:开发者可以用方便的泛型语法
- 部署兼容:生成的字节码能在现有老环境运行
- 渐进升级:不需要一次性升级所有JVM环境
总结
泛型是编译期的语法糖,通过擦除机制保证生成的字节码与老JVM兼容,而不是让老JVM直接理解泛型语法。
