泛型(Generic)
JDK5以前,对象保存到集合中就会失去其特性,取出时通常要程序员手工进行类型的强制转化,这样不可避免就会引发程序的一些安全性问题。
JDK5中的泛型允许程序员在编写集合代码时,就限制集合的处理类型,从而把原来程序运行时可能发生的问题,转变为编译时的问题,一次提高程序的可读性和稳定性
需要注意的问题:
1、 使用泛型时,泛型类型须为引用类型,不能是基本数据类型,并且如果两边都使用到了泛型,则必须一样
2、 泛型是提供给javac编译使用的,它用于限定集合的输入类型,让编译器在源代码级别上,即挡住向集合中插入非法数据。但编译器编译完带有泛型的java程序后,生成的class文件中将不带有泛型信息,以此使程序运行效率不受到影响,这个过程称之为“擦除”
3、 基本的术语,以ArrayList<E>为例:<>念typeof
ArrayList<E>中的E称为类型参数变量
ArrayList<Integer>中的Integer称为实际类型参数
整个称为ArrayList<E>泛型类型
整个ArrayList<E>称为参数化的类型
自定义带泛型方法
Public <T,E,K> void b(T t, E e, K k){}
如果在定义中很多方法都用到同一个泛型,那么就可以把泛型定义到类上,那么泛型就作用到整个类中
自定义类上的泛型:
定义在类上上的泛型对于静态方法是无效的,静态方法应该定义自己的泛型
Public static <T> void c(T t){}
练习:
1、 编写一个泛型方法,实现制定位置上的数组元素的交换
public <T>void swap(T arr[], int pos1, int pos2) {
T temp = arr[pos1];
arr[pos1] = arr[pos2];
arr[pos2] = temp;
}
2、 编写一个泛型方法,接收一个任意数组,并颠倒数组中的所有元素
public <T> voidreverse(T arr[]){
int start=0;
int end=arr.length-1;
while(true){
if(start>=end)
break;
T temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
start++;
end--;
}
}