java泛型简记
java泛型是用擦出实现的,即在编译时把类型信息变为object,然后运行是再动态确定类型信息
如
1 //简单的泛型 2 class Test<T> 3 { 4 private T e; 5 public void set(T e){ 6 this.e = e; 7 } 8 public void print(){ 9 System.out.println(e); 10 } 11 }
反编译后:
1 class Test 2 { 3 4 Test() 5 { 6 } 7 8 public void set(Object obj) 9 { 10 e = obj; 11 } 12 13 public void print() 14 { 15 System.out.println(e); 16 } 17 18 private Object e; 19 }
可见,编译器只是简单把类型信息T变为了Object,利用这一点我们可用反射机制突破编译器的限制
如:
1 class Main 2 { 3 4 @SuppressWarnings("unchecked") 5 public static void main(String[] args) throws Exception 6 { 7 //这里把类型参数设为String 8 Test<String> t = new Test<String>(); 9 //通过反射把Integer对象赋给成员变量e 10 t.getClass().getMethod("set",Object.class).invoke(t,new Integer(1)); 11 t.print(); 12 } 13 } 14 15 class Test<T> 16 { 17 private T e; 18 public void set(T e){ 19 this.e = e; 20 } 21 public void print(){ 22 System.out.println(e); 23 } 24 }
运行结果:1