黑马程序员-java高新技术_范型视频学习笔记


        Jdk1.5的集合类在希望你在定义集合时,明确表示你要向集合中装哪种类型的数据,无法加入指定类型以外的数据。
ArrayList<Integer> c=new ArrayList<<Integer>();
c.add(abc);//编译报错
        泛型是提供给java编译器使用的,让编译器挡住程序的非法输入,对于参数化的泛型,getClass返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的信息,只要跳过编译器,就可以往泛型集合中加入其它类型的数据,如:用反射得到集合,再调用其add方法即可。
知识点1:<>可以引用各种参数化的类型,可以调用与类型参数无关的方法,不能调用与类型参数有关的方法 
  限定通配符的上边界
  正确:Vector<? extends Number> v=new Vector<Integer>();
  错误:Vector<? extends Number> v=new Vector<String>();
  限定通配符的下边界
  正确:Vector<? Super Integer> v=new Vector<Number>();
  错误:Vector<? extends Integer > v=new Vector<Byte>();
  通配符包括自己,通配符是用于使用时不是定义时。
知识点2:通过反射获得泛型的参数化类型
nVector<Date> v = new Vector<Date>();
//通过v.getClass()是无法获得泛型的参数化类型的。
n//将其传递给一个方法,可实现此功能。
public static void applyVector(Vector<Date> v){}
nMethod applyMethod = GenericTest.class.getMethod("applyVector",  Vector.class);
Type[] types = applyMethod.getGenericParameterTypes();
ParameterizedType pType = (ParameterizedType)types[0];
System.out.println(pType.getRawType());//Vector
System.out.println(pType.getActualTypeArguments()[0]);//Date

 

    注意:
1、在对泛型参数化时,必须是引用类型,不能是基本类型。
2、当一个类被声明为泛型时,只能被实例变量和方法调用(还有内嵌类),而不能被静态变量和静态方法调用。因为类静态成员是被所有参数化的类所共享的,所以静态成员不应该拥有类级别的类型参数。
 
                                               ---------------------- android培训java培训、期待与您交流! ----------------------
  详细请查看:http://edu.csdn.net/heima
posted @ 2012-04-18 13:35  lcode  阅读(238)  评论(0编辑  收藏  举报