类型擦除
困扰了我很久的问题:什么是类型擦除
?
当把一个具有泛型信息的对象
赋给另一个没有泛型信息的对象
时,所有尖括号中的类型信息都会被扔掉
,这就是类型擦除
。
来看个例子:
@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 1
中integerApple
对象的泛型是Integer
,所以调用getSize()
方法后也返回Integer
。
在Section 2、3
中将integerApple
对象赋给泛型为通配符
、不带泛型信息(原生类型)
的对象时,
integerApple
中的泛型信息就会被擦除,由于其泛型形参的上限是Number
,
所以后两者调用getSize()
方法返回的是Number
类型。
Reference
《疯狂Java讲义 - 9.5》 - 擦除和转换
一位喜欢提问、尝试的程序员
(转载本站文章请注明作者和出处 姚屹晨-yaoyichen)