| 
                         3.2 验证实例: 
- public class GenericTest { 
 -  public static void main(String[] args) { 
 -  new GenericTest().testType(); 
 -  } 
 -  public void testType(){ 
 -  ArrayList<Integer> collection1 = new ArrayList<Integer>(); 
 -  ArrayList<String> collection2= new ArrayList<String>(); 
 -   
 -  System.out.println(collection1.getClass()==collection2.getClass()); 
 -  //两者class类型一样,即字节码一致 
 -   
 -  System.out.println(collection2.getClass().getName()); 
 -  //class均为java.util.ArrayList,并无实际类型参数信息 
 -  } 
 - } 
 
  
输出结果: 
- true 
 - java.util.ArrayList 
 
  
分析: 
这是因为不管为泛型的类型形参传入哪一种类型实参,对于Java来说,它们依然被当成同一类处理,在内存中也只占用一块内存空间。从Java泛型这一概念提出的目的来看,其只是作用于代码编译阶段,在编译过程中,对于正确检验泛型结果后,会将泛型的相关信息擦出,也就是说,成功编译过后的class文件中是不包含任何泛型信息的。泛型信息不会进入到运行时阶段。 
在静态方法、静态初始化块或者静态变量的声明和初始化中不允许使用类型形参。由于系统中并不会真正生成泛型类,所以instanceof运算符后不能使用泛型类 
4、泛型与反射 
把泛型变量当成方法的参数,利用Method类的getGenericParameterTypes方法来获取泛型的实际类型参数 
例子: 
- public class GenericTest { 
 -  public static void main(String[] args) throws Exception { 
 -  getParamType(); 
 -  } 
 -   
 -  /*利用反射获取方法参数的实际参数类型*/ 
 -  public static void getParamType() throws NoSuchMethodException{ 
 -  Method method = GenericTest.class.getMethod("applyMap",Map.class); 
 -  //获取方法的泛型参数的类型 
 -  Type[] types = method.getGenericParameterTypes(); 
 -  System.out.println(types[0]); 
 -  //参数化的类型 
 -  ParameterizedType pType = (ParameterizedType)types[0]; 
 -  //原始类型 
 -  System.out.println(pType.getRawType()); 
 -  //实际类型参数 
 -  System.out.println(pType.getActualTypeArguments()[0]); 
 -  System.out.println(pType.getActualTypeArguments()[1]); 
 -  } 
 -  /*供测试参数类型的方法*/ 
 -  public static void applyMap(Map<Integer,String> map){ 
 -  } 
 - } 
 
  
输出结果: 
- java.util.Map<java.lang.Integer, java.lang.String> 
 - interface java.util.Map 
 - class java.lang.Integer 
 - class java.lang.String 
 
  
通过反射绕开编译器对泛型的类型限制 
- public static void main(String[] args) throws Exception { 
 -         //定义一个包含int的链表 
 -         ArrayList<Integer> al = new ArrayList<Integer>(); 
 -         al.add(1); 
 -         al.add(2); 
 -         //获取链表的add方法,注意这里是Object.class,如果写int.class会抛出NoSuchMethodException异常 
 -         Method m = al.getClass().getMethod("add", Object.class); 
 -         //调用反射中的add方法加入一个string类型的元素,因为add方法的实际参数是Object 
 -         m.invoke(al, "hello"); 
 -         System.out.println(al.get(2)); 
 -     } 
 
  
5 泛型的限制 
5.1 模糊性错误 
                        (编辑:我爱故事小小网_铜陵站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |