【Java】什么是泛型擦除

什么是泛型擦除

泛型擦除(Generic Type Erasure)是Java中的一种编译器优化技术,它在编译时期将泛型类型信息从运行时的代码中移除。泛型是Java 5中引入的特性,它允许在编写代码时使用参数化类型,以增加代码的类型安全性和重用性。

在编译过程中,Java编译器会对泛型类型进行类型检查,并在必要时插入类型转换代码。但是,一旦编译器完成了类型检查和类型转换,它就会将泛型类型的信息擦除,将泛型类型替换为原始类型(raw type)或者它们的上界(bound)。

例如,考虑以下的泛型类定义:

public class MyList<T> {
    
    
    private T value;
    
    public void setValue(T value) {
    
    
        this.value = value;
    }
    
    public T getValue() {
    
    
        return value;
    }
}

当使用泛型类创建对象时,编译器会在编译时期执行类型检查,并在必要时插入类型转换代码。但是,生成的字节码中将不会包含泛型类型的信息。例如,以下代码片段:

MyList<Integer> myList = new MyList<>();
myList.setValue(10);
Integer value = myList.getValue();

在编译后的字节码中,将会变成以下代码:

MyList myList = new MyList();
myList.setValue(Integer.valueOf(10));
Integer value = (Integer) myList.getValue();

可以看到,编译器在字节码中将泛型类型擦除为原始类型(raw type)。这样做的好处是可以保持与之前版本的Java代码的兼容性,因为泛型类型的信息在运行时不再需要。

然而,由于泛型类型信息在运行时被擦除,有时候会导致在使用泛型时出现编译器无法检查的类型错误。为了解决这个问题,Java提供了一些机制,如通配符类型(wildcard type)和类型边界(type bound),以在编译期间提供类型安全性。

猜你喜欢

转载自blog.csdn.net/weixin_42473228/article/details/134190721