📜  Java泛型-类型擦除(1)

📅  最后修改于: 2023-12-03 15:16:36.132000             🧑  作者: Mango

Java泛型-类型擦除

Java泛型是在JDK1.5中引入的,它通过使用泛型参数来提高代码的安全性、可读性和可重用性。然而,Java泛型中存在一种叫做“类型擦除”的机制,它在编译期间会将泛型的类型擦除掉,以便在运行时更好地支持Java虚拟机。

泛型类型擦除

泛型类型擦除是指在编译期间,Java编译器会将所有泛型类型都替换为它们的原始类型,并在必要时插入强制类型转换。这意味着在运行时,泛型信息不再存在,因为泛型类型信息已被擦除。

例如,下面的代码:

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

在编译期间,它将被转换为:

public class Test {
    private Object value;
    
    public void setValue(Object value) {
        this.value = value;
    }
    
    public Object getValue() {
        return value;
    }
}

泛型类型T被替换为Object类型,并且编译器插入了一些强制类型转换。

泛型类型边界擦除

泛型类型边界是指对泛型参数类型的限制条件。在Java泛型中,我们可以使用extends关键字来定义泛型参数的类型边界。例如:

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

这里泛型参数T被限制为Number类或其子类。然而,在编译器擦除泛型类型信息时,泛型边界也会被擦除。

例如,上面的代码在编译期间将被转换为:

public class Test {
    private Number value;
    
    public void setValue(Number value) {
        this.value = value;
    }
    
    public Number getValue() {
        return value;
    }
}

注意,泛型参数T的类型边界被替换为了Number类型,并且没有相关的泛型信息。

泛型类型擦除的影响

泛型擦除对Java程序的影响主要有两个:

  1. 对于已经存在的Java代码并没有任何影响。因为它们已经被编译为字节码,其泛型信息已经丢失。
  2. 在某些情况下,泛型类型擦除会导致编译器生成无法预测的代码。例如,如果我们使用泛型类型数组时,编译器会生成一个警告。
总结

Java泛型中的类型擦除是一种编译器优化机制,它可以减少Java虚拟机的压力,并提高程序的运行时性能。虽然泛型类型信息在编译期间被擦除了,但在运行时仍然可以使用泛型。因此,我们可以利用泛型来提高代码的可读性和可重用性。