Java集合如Map、Set、List等全部集合只能存放引用類型數據,它們都是存放引用類型數據的容器,不能存放如int、long、float、double等基礎類型的數據。java
使用反射能夠破解泛型T類型,以下:spa
ArrayList<Integer> array=new ArrayList<Integer>(); array.add(1);//這樣調用add方法只能存儲整形,由於泛型類型的實例爲Integer array.getClass().getMethod("add", Object.class).invoke(array, "asd"); //經過反射能夠加入字符串類型
反射的使用:根據類名、方法名以及方法對應的參數,獲取方法,並實現方法的調用。
調用getMethods方法輸出的是自身的public方法和父類父接口的public方法。
調用getDeclaredMethods方法輸出的是自身的public、protected、private、default方法。
泛型擦除概念:code
聲明時的泛型擦除處理機制:blog
編譯成.class文件時,會將.java文件中泛型作一些特殊處理:將類的泛型T去掉,將類中方法中的泛型T(方法參數和返回值T)變成Object,看下邊例子,你就秒懂接口
//類中方法上的泛型
public T set(int index, T element) { public set(ILjava/lang/Object;)Ljava/lang/Object;
//類上的泛型
public class FXClass<T> implements List<T> { public class com/example/zs/fanxing/FXClass implements java/util/List {
引用時的泛型擦除處理機制:element
FXClass<Integer> list1 = new FXClass<Integer>(); list1.add(new Integer(10)); list1.add(new Integer(20)); Integer a =list1.get(0);//這行對應的字節碼指令以下:
INVOKEVIRTUAL com/example/zs/fanxing/FXClass.get (I)Ljava/lang/Object;
CHECKCAST java/lang/Integer//這句指令的出現是由於源代碼中使用了 (Integer a =)
劃重點,我的理解:
1)get(0)得到的是Object類型,可是編譯器看到咱們把Object類型賦值給了整形a,因此會生成一條指令CHECKCAST,字符串
運行時會檢查Object能不能轉成Integer類型,而且這條指令會拋異常呦。get
2)get(0)並無手動強轉Integer,但編譯器卻能夠調用Integer的方法。編譯器