泛型是 Java SE 1.5 版本之后的新特性。在Java SE 1.5 版本之前,Java 通过对类型Object 的引用来实现参数类型的“任意化”,特点则是需要进行显式的强制类型转换,但编译器无法发现强制类型转换可能引起的异常,异常只有在运行时才出现,这将成为系统的安全隐患。
如今,在Java 集合框架的API 中,绝大部分接口和类都已经泛型化。事实上,在eclipse-jee 中,通过链接跟踪方式,可以打开接口List 的源码如下:
public interface List<E> extends Collection<E> { //使用E 定义泛型类
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator(); //使用E 声明泛型方法
Object[ ] toArray();
<T> T[ ] toArray(T[ ] a); //方法及其参数使用了泛型Tboolean add(E e);
//其他成员略
}
List<E>表示该集合由E 类型的实例对象组成,即E 是泛型。
泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数,此参数类型可以用在类、接口和方法的声明及创建中,分别被称为泛型类、泛型接口及泛型方法。
注意:泛型能提高程序的通用性,定义泛型方法时需要使用一对尖括号< >来表示。
使用Java 泛型,分别输出数值数组与字符串数组中2 号与4 号元素交换的结果。
在成员方法声明及其方法内部分别使用泛型T,而在类声明里没有使用泛型,程序代码如下:
import java.util.Arrays;
public class TestRawTypeMethod { // 定义交换数组中两个元素的泛型方法
public static <T> void changePosition(T[] arr, int index1, int index2) { //泛型方法
T temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
} public static void main(String[] args) {
Integer[] arr1 = new Integer[] { 1, 2, 3, 4, 5 }; //对象数组
//int[]arr1=new int[]{1,2,3,4,5}; //调用时会报错,泛型不是值类型
System.out.println("原数组:" + Arrays.toString(arr1)); // 输出数组
changePosition(arr1, 1, 3); // 交换位置
System.out.println("交换后:" + Arrays.toString(arr1)); // 输出数组 String[] arr2 = new String[] { "aa", "bb", "cc", "dd", "ee" };
System.out.println("原数组:" + Arrays.toString(arr2)); // 输出数组
changePosition(arr2, 1, 3); // 交换位置
System.out.println("交换后:" + Arrays.toString(arr2)); // 输出数组
}
}
结果:
原数组:[1, 2, 3, 4, 5]
交换后:[1, 4, 3, 2, 5]
原数组:[aa, bb, cc, dd, ee]
交换后:[aa, dd, cc, bb, ee]