泛型(Generics)是 Java 5 引入的一个重要特性,它允许在定义类、接口和方法时使用类型参数,从而提高代码的复用性和类型安全性。本文将详细解析 Java 中的泛型,包括其定义、使用场景和优势。
泛型是一种参数化类型机制,允许在定义类、接口或方法时使用类型参数(Type Parameters),这些类型参数在实例化或调用时被具体的类型替换。
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
interface Pair<K, V> {
K getKey();
V getValue();
}
泛型在编译时进行类型检查,避免运行时类型转换错误。
List<String> list = new ArrayList<>();
list.add("Hello");
// list.add(10); // 编译错误:类型不匹配
String value = list.get(0); // 无需强制类型转换
泛型允许编写通用的代码,适用于多种类型,减少代码重复。
class Box<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
Box<Integer> intBox = new Box<>();
Box<String> strBox = new Box<>();
泛型避免了手动类型转换,使代码更简洁、易读。
List<String> list = new ArrayList<>();
list.add("Hello");
String value = list.get(0); // 无需强制类型转换
泛型在编译时进行类型检查,避免了运行时的类型转换开销。
Java 集合框架(如 List
、Set
、Map
)广泛使用泛型,确保集合中元素的类型安全。
List<String> names = new ArrayList<>();
names.add("Alice");
names.add("Bob");
String name = names.get(0); // 无需类型转换
通过泛型类,可以创建适用于多种类型的通用类。
class Pair<K, V> {
private K key;
private V value;
public Pair(K key, V value) {
this.key = key;
this.value = value;
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
Pair<String, Integer> pair = new Pair<>("Age", 25);
泛型方法允许在方法级别使用类型参数,适用于多种类型。
public <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
Integer[] intArray = {1, 2, 3};
String[] strArray = {"A", "B", "C"};
printArray(intArray);
printArray(strArray);
泛型接口允许定义通用的接口,适用于多种类型。
interface Comparator<T> {
int compare(T o1, T o2);
}
class StringComparator implements Comparator<String> {
public int compare(String s1, String s2) {
return s1.compareTo(s2);
}
}
Java 的泛型在编译时进行类型擦除(Type Erasure),泛型类型参数在运行时被替换为 Object
或指定的上限类型。
List<String> list = new ArrayList<>();
// 编译后:List list = new ArrayList();
泛型类型参数必须是引用类型,不能使用基本类型(如 int
、char
)。
// List list = new ArrayList<>(); // 编译错误
List<Integer> list = new ArrayList<>(); // 正确
不能直接创建泛型数组,但可以通过类型转换实现。
// List[] array = new List[10]; // 编译错误
List<String>[] array = (List<String>[]) new List[10]; // 正确
泛型是 Java 中强大的特性,具有以下优势: