原始类型带来的擦除
当把一个具有泛型信息的对象付给另一个没有泛型信息的变量时,所有尖括号里的额信息类型都将被丢弃,比如将一个List<String>类型的对象转型为List,则该List对集合元素的检查变成了类型变量的上限(即Object)。
下面展示了这种擦除:
package me.timlong.cultivate.genericity;
class Apple<T extends Number>{
T size;
public Apple() {
}
public Apple(T size) {
this.size = size;
}
public T getSize() {
return size;
}
public void setSize(T size) {
this.size = size;
}
}
public class ErasureTest {
public static void main(String[] args) {
Apple<Integer> apple = new Apple<Integer>(6);
//apple的getSize()方法返回Integer对象
Integer size = apple.getSize();
//把apple对象 赋给aa对象,将会丢失<>里的类型信息
Apple aa = apple;
//aa只知道size的类型信息是Number
Number num = aa.getSize();
//下面的这行代码将会引起错误
Integer intNum = aa.getSize();
// System.out.println("size : " + size + "\nnum : " + num + "\nintNum : " + intNum );
}
}
从上面的程序中可以看出,当把一个带泛型信息的Java对象赋给不带泛型信息的对象时,Java程序会发生擦除,这种擦除不仅会擦除使用该Java类时传入的类型实参,而且会擦除所有的泛型信息。因此,当我们在Java中使用带泛型信息的类时,需要明确具体的泛型信息,防止Java擦除的发生。