1. 所有反射的操作都是在运行时的,一般程序会采取去泛型化的操作。
也就是说Java中的泛型只是在编译阶段有效,在编译过程中,正确检验泛型结果后,会将泛型的相关信息抹掉,并且在对象进入和离开方法的的时候添加类型检查和类型转换的方法,通俗的说就是成功编译过后的class文件中是不包含任何泛型信息的。
Listlist = new ArrayList ();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.
class FX{ private T ob; public FX(T ob) { this.ob = ob; } public T getOb() { return ob; } public void setOb(T ob) { this.ob = ob; }}
//通配符 FXex_num = new FX (100); FX ex_int = (FX ) 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 getDate(FX temp){ System.out.println("class type:" + temp.getClass()); return temp; }
限定通配符:FX<? extends T> 类型必须是T类型或者T的子类; FX<? super T>类型必须是T类型或者T 的父类。
非限定通配符:FX<?> 可以用任意类型来替代。