【Java筆記】泛型擦除
阿新 • • 發佈:2018-11-21
要求:定義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); } }
其實泛型擦除並沒有什麼實際價值,只是為了讓我們更瞭解通過反射獲得類的方法執行而已。