Java 类型擦除是指在编译时将泛型类型擦除为原始类型,并在运行时不再包含泛型类型信息。这是由于泛型类型信息只存在于编译时,而在运行时泛型类型信息已被擦除。因此,运行时只能看到原始类型的信息。
下面是一个简单的示例,也是理解泛型累i系那个擦除的经典demo,能直接的说明 Java 类型擦除的概念和原理:
public class Demo<T> {
private T value;
public Demo(T value) {
this.value = value;
}
public void print() {
System.out.println(value.getClass());
}
public static void main(String[] args) {
Demo<Integer> demo1 = new Demo<>(1);
Demo<String> demo2 = new Demo<>("Hello");
demo1.print(); // 输出 class java.lang.Integer
demo2.print(); // 输出 class java.lang.String
System.out.println(demo1.getClass() == demo2.getClass()); // 输出 true
}
}
在这个示例中,我们定义了一个泛型类 Demo,其中的 T 是一个泛型类型参数。在类中,我们定义了一个属性 value,表示一个泛型类型的值,并提供了一个方法 print(),用于打印当前对象的类型。
在 main() 方法中,我们分别创建了两个不同类型的 Demo 对象,并调用了它们的 print() 方法。我们可以看到,输出的结果都是类型信息,分别是 Integer 和 String。
但是,我们可以通过比较两个对象的类来发现,它们的类型是相同的。这是因为在运行时,Java 类型擦除了泛型类型信息,并将泛型类型参数 T 擦除为原始类型 Object。因此,在运行时只能看到原始类型的信息,而无法区分泛型类型的差异。
总之,Java 类型擦除是泛型类型系统的一项重要特性,它使得泛型代码可以与原始类型代码无缝地集成。虽然在运行时丢失了泛型类型信息,但是在编译时可以使用泛型类型信息来进行类型检查和推断,从而提高代码的安全性和可读性。