1. 程式人生 > >【Java筆記】泛型擦除

【Java筆記】泛型擦除

要求:定義ArrayList<String>集合,如何實現向集合中新增Integer型別的值?

實現這個要求前,我們可以先了解偽泛型的概念,即編譯後的Class檔案中其實是沒有泛型約束的,請看程式碼:

public class Test {
public void doTwo(List<String> list){
}
public void doTwo(List<Integer> list){
}
}

上面的程式碼, 會在編譯的時候出問題, 因為引數List<String> list 和 List<Integer> list會在編譯後會被擦除掉 ,變成原生一模一樣的型別List<E>,導致無法過載,這就是Java中的偽泛型。

那麼既然編譯後的Class檔案沒有泛型,那麼我們就可以通過反射對Class檔案進行操作,達到將不同型別的數值放入固定型別的集合中的目的。

實現步驟:1.通過反射獲取集合中Class檔案物件

                  2.通過Class檔案物件,呼叫集合的add方法儲存數值

public class ReflectTest {
	public static void main(String[] args) throws Exception {
		ArrayList<Integer> list = new ArrayList<Integer>();
		//新增元素到集合
		list.add(new Integer(30));
		list.add(new Integer("12345"));
		list.add(123);
		//list.add("哈哈");//因為有泛型型別的約束
		System.out.println(list);
		
		//通過反射技術,實現新增任意型別的元素
		//1, 獲取位元組碼檔案物件
		//Class c = list.getClass();
		//Class c = ArrayList.class;
		Class c = Class.forName("java.util.ArrayList");
		
		//2, 找到add()方法
		// public boolean add(E e)
		Method addMethod = c.getMethod("add", Object.class);
		
		//3,  執行add()方法
		addMethod.invoke(list, "哈哈");// list.add("哈哈");
		System.out.println(list);
	}
}

其實泛型擦除並沒有什麼實際價值,只是為了讓我們更瞭解通過反射獲得類的方法執行而已。