`
1enny
  • 浏览: 70240 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

泛型

 
阅读更多

第7单元:java5的泛型

36.入门泛型的基本应用
泛型是提供给javac使用的,可以限定集合中的输入参数,让编译器挡住源程序中的非法输入
编译器编译带类型说明的集合时会去除掉“类型”信息,是程序在运行时期效率不受影响,对于参数
化的泛型类型,getClass()方法返回值和原始类型完全一样,由于编译生成的字节码会去掉泛型的类型信息,只要跳过编译器,就可以往某个泛型集合中假如其他类型的数据,
例如:反射到集合,再调用add方法即可

 ArrayList<String> arr = new ArrayList<String>();
         Method method = arr.getClass().getMethod( "add", Object.class);
         method.invoke( arr, 111);
         System. out.println(arr.size());//报错


37.泛型的内部原理及更深应用



38.泛型的通配符扩展应用
“?” :适合任何类型,泛型类型不存在继承关系;他可以引用其他各种参数化类型,他定义的变量
主要用作引用,可以调用与参数化无关的方法,不能调用与参数化有关的方法
限定符的扩展:限定通配符总是包括自己的
1.限定通配符的上界:
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<? extends Number> x = new Vector<String>();
2.限定通配符的下边界:
正确:Vector<? super Integer> x = new Vector<Number>();
错误: Vector<? super Integer> x = new Vector<Byte>();
40.自定义泛型方法及其应用
41.自定义泛型方法的练习与类型推断总结




42.自定义泛型类的应用

43.通过反射获得泛型的实际类型参数
         public void method2(ArrayList<String>[] array,
             HashMap<String, Integer>[] hash, int aa) {
    }

    public static void getGenericParameterTypesTest()
              throws NoSuchMethodException, SecurityException {
         Method[] methods = FanxingTest.class .getMethods();
         
          for (Method method : methods) {
              if (method.getName().equals("method2" )) {

                  //如果形参类型是参数化类型,则为其返回的 Type 对象必须实际反映源代码中使用的实际类型
               //参数。如果形参类型是类型变量或参数化类型,则创建它。否则将解析它。
                 Type[] types = method.getGenericParameterTypes();
                  for (int i = 0; i < types.length; i++) {
                     System. out.println(method.getName()+"========" +types[i]);
                 }
             }
         }
    }
package java_5;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Date;
import java.util.Vector;


public class GenericDAO {
    public static void main(String[] args) throws Exception{
         Method method = GenericDAO.class .getMethod("apply", Vector. class);
         
          //得到泛型化的参数类型,返回的是一个数组,因为一个方法可能有多个泛型化的参数类型
          Type[] genericParameter = method.getGenericParameterTypes();
         
          /*
           * 这里方法apply只有一个泛型化的参数类型,所以取下标为0,
           * ParameterizedType代表一个参数化的类型,例如Vector<Date>
           */
          ParameterizedType parameterizedType = (ParameterizedType)genericParameter[0];
         
          //打印出参数化类型的原始类型
          System.out.println(parameterizedType.getRawType());
         
          /*
           * parameterizedType.getActualTypeArguments()返回的是实际类型的数组,
           * 因为可能有多个如:Map<k,v>这里只有一个,所以取下标0
           */
          System.out.println(parameterizedType.getActualTypeArguments()[0]);   
    }
    
    /*
     * 通过vector是没办法得到泛型Vector传进来的是什么类型,即无法得到Date类型
     * 通过apply方法是可以得到它的泛型化参数类型是什么类型的
     */
    public void apply(Vector<Date> vector)
    {

    }
}



分享到:
评论
2 楼 木易之手 2016-08-25  
getGenericParameterTypesTest()虽然知道是方法,但这么长,看不懂啊, ,可以写简单些的吗,泛型传参数的
1 楼 笑笑和坤坤 2015-07-15  

相关推荐

Global site tag (gtag.js) - Google Analytics