且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java范型深入理解,利用反射穿透编译器忽略范型

更新时间:2022-08-13 08:22:53

Java中的范型的作用阶段是在 编译时,也就是说范型是给编译器看的    。

我们经常看到  类 ArrayList<E>      后面的<E>  就是类型化参数,说明这个 ArrayList支持  范型化   。

比如   ArrayList<Integer>    就叫做Integer类型化的ArrayList.,当编译完之后 在运行阶段 就会丢掉 类型化参数   。 

 

范型化后的 类型  与原始类型之间的操作: 

Collection c=new Vector<Integer>() ;          可以 

 

Collection<Integer> c=new Vector() ;  //也可以   

 

 

Vector<Integer>  ccc=new Vector<Object>();     //错误 因为 前后类型不匹配     Object'课代表任意类型

 


  Vector<Integer>[]  cccc=new Vector<Object>[10]();    //数组不能进行范型化 ,因为每个Vector本身就像当一个数组 每个数组都有自己的类型
  


  Vector  v=new Vector<String>() ;   
  Vector<Object> v1=v ;       //虽说前后类型不匹配但是也可以  因为编译器进行语法检查是一行行的往下走的    走到第二部的时候 v 就是原始没有 范型化的Vector对象  

 

 

利用反射穿透编译器 忽略范型:

ArrayList<Integer>  col1=new ArrayList() ; 
  col1.getClass().getMethod("add",Object.class).invoke(col1, "reflect") ;   //这个运行时候才会调用 于是就跳过了编译器
  System.out.println(col1.get(0));