1. 全部反射的操做都是在運行時的,通常程序會採起去泛型化的操做。this
也就是說Java中的泛型只是在編譯階段有效,在編譯過程當中,正確檢驗泛型結果後,會將泛型的相關信息抹掉,而且在對象進入和離開方法的的時候添加類型檢查和類型轉換的方法,通俗的說就是成功編譯事後的class文件中是不包含任何泛型信息的。spa
List<String> list = new ArrayList <String>(); list.add("String"); Class clazz = list.getClass(); try { Method method = clazz.getMethod("add",Object.class); method.invoke(list,100); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } System.out.println(list); //結果是:[String, 100]
這個例子繞過了編譯,也就是繞過了泛型。對象
2.get
class FX<T>{ private T ob; public FX(T ob) { this.ob = ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; } }
//通配符 FX<Number> ex_num = new FX<Number>(100); FX<Integer> ex_int = (FX <Integer>) getDate(ex_num); getDate(ex_int); getDate(ex_num); } /** * 通配符 */ /* public static FX<?> getDate(FX<?> temp){ System.out.println(temp.getOb()); return temp; }*/ public static FX<? extends Number> getDate(FX<? extends Number> temp){ System.out.println("class type:" + temp.getClass()); return temp; }
限定通配符:FX<? extends T> 類型必須是T類型或者T的子類; FX<? super T>類型必須是T類型或者T 的父類。io
非限定通配符:FX<?> 能夠用任意類型來替代。編譯