黑马程序员-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<? 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>();
正确: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、当一个类被声明为泛型时,只能被实例变量和方法调用(还有内嵌类),而不能被静态变量和静态方法调用。因为类静态成员是被所有参数化的类所共享的,所以静态成员不应该拥有类级别的类型参数。
2、当一个类被声明为泛型时,只能被实例变量和方法调用(还有内嵌类),而不能被静态变量和静态方法调用。因为类静态成员是被所有参数化的类所共享的,所以静态成员不应该拥有类级别的类型参数。