Java泛型类型擦除

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 类型擦除是泛型类型系统的一项重要特性,它使得泛型代码可以与原始类型代码无缝地集成。虽然在运行时丢失了泛型类型信息,但是在编译时可以使用泛型类型信息来进行类型检查和推断,从而提高代码的安全性和可读性。