黑马程序员-java泛型

泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编译带类型说明的集合时会去除掉“类型”信息,使程序院校效率不受影响。对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译生成的字节码会去掉泛型的类型信息,只用能跳过编译器,就可以往某个泛型集合中加入其他类型的数据,例如,用反射得到集合,再调用其add方法即可。
ArrayList<String> collection2=new ArrayList<String>(); ArrayList<Integer> collection3=new ArrayList<Integer>();
System.out.println(collection2.getClass()==collection3.getClass());
结果为true

ArrayList<Integer> collection3=new ArrayList<Integer>(); collection3.getClass().getMethod("add",Object.class).invoke(collection3,"abc");
System.out.println(collection3.get(0));

正常输出结果,结果为abc
ArrayList<E>类定义和ArrayList<Integer>类引用涉及如下术语: 整个称为ArrayList<E>泛型类型 ArrayList<E>中的E称为类型变量或类型参数
整个称为ArrayList<Integer>称为参数化的类型
ArrayList<Integer>中的Integer称为类型参数的
实例或实际类型参数 ArrayList<Integer>中的<>念typeof ArrayList称为原始类型
参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始类型的对象,编译报告警告: Collection<String> c=new Vector(); 原始类型可以引用一个参数化类型的对象,编译报告警告: Collection c=new Vector<String>();
参数化类型不考虑类型参数的继承关系
Vector<String> v=new Vector<Object>();//错误
Vector<Object> v=new Vector<String>();//错误
泛型中的?通配符的扩展
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>();

编写一个泛型方法,自动将Object类型的对象转换成String. Object obj="abc"; String x3=autoConvert(obj); private static <T> T autoConvert(Object obj){ return (T)obj; } 定义一个方法,可以将任意类型的数组的所有元素填充为相应类型的某个对象。
private static <T> void fillArray(T[] a,T obj){ for (int i = 0; i < a.length; i++) { a[i]=obj; } } 采用自定义泛型方法的方式打印出任意参数化类型的集合中的所有内容。

private static <T> void printCollection(Collection<T> collection2) { for (Object obj : collection2) { System.out.println(obj); } }

posted @ 2012-12-22 22:07  tse johnson  阅读(199)  评论(0编辑  收藏  举报