Java原始類型帶來的擦除

原始類型帶來的擦除

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

    再見

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章