Java泛型
1. 泛型的意义
Java泛型的出现提高了集合的安全性,Java泛型只存在于编译期,是给编译器检查java语法用的,Java源码编译后形成.class字节码文件时会将泛型擦除掉。因此,带有泛型的集合,仍然可以通过反射的方式将不同类型的值设置进集合。
2.基本术语
定义泛型:
ArrayList<E> :E为类型参数变量
ArrayList<E>:整体称为泛型类型
泛型的使用:
new ArrayList<Integer>():Integer即为实际参数类型
new ArrayList<Integer>():整体称为参数化的类型
3.泛型类型的定义:
方式一:在方法上进行声明
public class GenericDemo {
//1.泛型必须先声明才能使用
//2.<E>即为声明的泛型类型,需放在返回值之前
public <E> E method1(E e){
return e;
}
public <E> void method2(E e){
}
public <E> void method3(Class<E> clazz){
}
}
方式二:在类上进行声明
//1.在类上进行泛型的声明后,在实例方法上就可以直接使用
//2.但静态方法即使类上已经声明过,在方法上仍需声明
public class GenericDemo<E> {
public E method1(E e){
return e;
}
public void method2(E e){
}
public void method3(Class<E> clazz){
}
//静态方法仍需声明后才能使用
public static <E> void method4(E e){
}
}
4.示例
示例1:
public class GenericDemo {
//对任意类型的数组进行两个元素的交换
public static <E> void swap(E[] array,int i,int j){
E temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
测试:
public class ClientTest {
public static void main(String[] args) {
//此处定义的数组需要使用基本类型的包装类
Integer[] nums = {1,2,3,4,5};
GenericDemo.swap(nums, 1, 3);
System.out.println(Arrays.asList(nums));
}
}
打印结果:
示例2:
public class GenericDemo {
//对任意类型的数组进行两个元素的交换
public static <E> void swap(E[] array,int i,int j){
E temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//将任意类型的数组进行反转
public static <E> void reverse(E[] array){
int start = 0;
int end = array.length -1;
while(start<end){
swap(array, start, end);
start++;
end--;
}
}
}
测试:
public class ClientTest {
public static void main(String[] args) {
//此处定义的数组需要使用基本类型的包装类
Integer[] nums = {1,2,3,4,5};
Integer[] nums1 = {1,2,3,4,5,6};
String[] strs = {"abc","def","ghi","jkl"};
GenericDemo.reverse(nums);
GenericDemo.reverse(nums1);
GenericDemo.reverse(strs);
System.out.println(Arrays.asList(nums));
System.out.println(Arrays.asList(nums1));
System.out.println(Arrays.asList(strs));
}
}
打印结果:
总结:利用好java泛型会写出优雅的代码,提高代码的重用性。