當把一個具有泛型信息的對象付給另一個沒有泛型信息的變量時,所有尖括號裏的額信息類型都將被丟棄,比如將一個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擦除的發生。