面试回答
类型擦除是 Java 在处理泛型的一种方式,如 Java 的编译器在编译以下代码时:
public class Main<T> {
T bar;
void doSth(T param){
}
Main<String> m1;
Main<Integer> m2;
public static void main(String[] args) {
}
}
在编译后字节码文件中,会把泛型的信息擦除掉:
public class Main
{
public Main()
{
}
void doSth(Object obj)
{
}
public static void main(String args1[])
{
}
Object bar;
Main m1;
Main m2;
}
也就是说,在代码中的 Main 和 Main 使用的类,经过编译后都是同一个类。
所以说泛型技术实际上是 Java 语言的一个语法糖,因为泛型经过编译器处理之后就被擦除了,编译器根本不认识泛型。
这种擦除的过程,被称之为 —— 类型擦除。所以类型擦除指的是通过类型参数合并,将泛型类型实例关联到同一份字节码上。编译器只为泛型类型生成一份字节码,并将其实例关联到这份字节码上。类型擦除的关键在于从泛型类型中清楚类型参数的相关信息,并且在必要的时候添加类型检查和类型转换的方法。
类型擦除可以简单的理解为泛型 java 代码转换为普通 java 代码,只不过编译器更直接点,将泛型 java 代码直接转换成普通 java 字节码。