1,泛型是在jdk1.5才有的概念。在jdk1.5的集合类希望你在定义集合时,明确表示你要向集合中加入那种类型的数据,无法加入指定类型之外的数据。这是用
泛型是比较合适的。
比如:
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);//这是可以加进去的。
list.add(lL);//这是不可以的,编译器就报告语法错误。
list.add("abc");//这也是报语法错误。
泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编译带类型参数说明的集合石会去掉“类型"信息
,是程序运行效率不受影响,对于参数化的泛型类型,getClass()方法返回值和原始类型完全一样。由于编译
生成的字节码会去掉泛型的类型信息,只要能跳过编译器,就可以往泛型集合中加入其他类型的数据。例如
用反射得到集合,在调用起add方法集合。
ArrayList<Integer> list = new ArrayList<Integer>();
list.getClass().getMethod("add",Object.class).invoke(list,"abc");
这样就可以加入数据。
1,参数化类型与原始类型的兼容性:
参数化类型可以引用一个原始的对象,编译器报警告,例如:
Collection<String> c = new Vector();//不会报错
原始类型可以引用一个参数化类型的对象,编译器报警告,例如:
Collection c = new Vector<String>();
但参数化类型不考虑类型参数的继承关系:
Vector<String> v = new Vector<Object>;//错误,
Vector<Object> v = new Vector<String>();//错误
在创建数组实例石,数组的元素不能使用参数化的类型,例如,
Vector<Integer> [] ve = new Vector<Integer> [10];
2,泛型中的?通配符的扩展
限定通配符的上边界
正确:Vector<? extends Number> x = new Vector<Integer>();
错误:Vector<?extends Number> x = new Vector<String>();
限定通配符的下边界:
正确:Vector <? super Integer> x = new Vector<Number>();
错误:Vector<? super Integer> x = new Vector<Byte>();
提示:限定通配符总是包括自己。
类型参数的类型推断:
定义泛型:
public class Fanxing<T> {
public void te(T t){
}
public static<T> void c(T t){
}
}
上面的定义是正确的。