Java - 泛型类型擦除

2020/02/14

类型擦除

困扰了我很久的问题:什么是类型擦除

当把一个具有泛型信息的对象赋给另一个没有泛型信息的对象时,所有尖括号中的类型信息都会被扔掉,这就是类型擦除

来看个例子:

@Setter
@Getter
public class Apple<T extends Number> {

    private T size;

    public Apple(T size){
        this.size = size;
    }
}

@Test
public void typeEraseTest(){
    // Section 1
    Apple<Integer> integerApple = new Apple<>(8);
    Integer intSize = integerApple.getSize();

    // Section 2
    Apple<?> wildcardApple = integerApple;
    Number numsize1 = wildcardApple.getSize();

    // Section 3
    Apple rawApple  = integerApple;
    Number numSize2 = rawApple.getSize();
}

可以看到,在Section 1integerApple对象的泛型是Integer,所以调用getSize()方法后也返回Integer

Section 2、3中将integerApple对象赋给泛型为通配符不带泛型信息(原生类型)的对象时,
integerApple中的泛型信息就会被擦除,由于其泛型形参的上限是Number
所以后两者调用getSize()方法返回的是Number类型。

Reference

  • 《疯狂Java讲义 - 9.5》 - 擦除和转换


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory