詳解 Java 泛型:核心概念與實用示例
Java 泛型(Generics)是Java SE 5引入的一項特性,旨在提高代碼的可重用性和類型安全性。通過泛型,開發者可以編寫一個通用的類、接口或方法,可以與多種類型一起工作,而不需要為每種類型創建不同的版本。
泛型的核心概念
泛型類(Generic Class):
泛型類是包含一個或多個類型參數的類。例如:
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}
這里,T 是類型參數,可以在創建 Box 對象時指定具體的類型:
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
泛型方法(Generic Method):
泛型方法是包含類型參數的方法。類型參數在方法的聲明中被指定。例如:
public class GenericMethodExample {public static <T> void printArray(T[] array) {for (T element : array) {System.out.println(element);}}public static void main(String[] args) {Integer[] intArray = {1, 2, 3, 4};String[] stringArray = {"A", "B", "C"};printArray(intArray);printArray(stringArray);}
}
泛型接口(Generic Interface):
泛型接口和泛型類類似。它們允許類型參數在接口中使用。例如:
public interface Pair<K, V> {K getKey();V getValue();
}public class OrderedPair<K, V> implements Pair<K, V> {private K key;private V value;public OrderedPair(K key, V value) {this.key = key;this.value = value;}public K getKey() { return key; }public V getValue() { return value; }
}
類型通配符(Wildcard):
泛型中的通配符用于表示未知類型。通配符有三種形式:
- 無限制通配符(?):表示任何類型。
public void printList(List<?> list) {for (Object elem : list) {System.out.println(elem);}
}
- 有上限的通配符(? extends Type):表示類型是 Type 或其子類。
public void processList(List<? extends Number> list) {for (Number num : list) {System.out.println(num);}
}
- 有下限的通配符(? super Type):表示類型是 Type 或其父類。
public void addNumber(List<? super Integer> list) {list.add(new Integer(123));
}
類型擦除(Type Erasure):
泛型在編譯時會進行類型擦除,這意味著泛型類型在運行時被移除,并替換為其限定類型(如果未指定,則為 Object)。這使得泛型可以與非泛型代碼互操作。
public class Box<T> {private T content;public void setContent(T content) {this.content = content;}public T getContent() {return content;}
}
編譯后:
public class Box {private Object content;public void setContent(Object content) {this.content = content;}public Object getContent() {return content;}
}
使用泛型的注意事項
不能創建泛型類型的實例:
public class Box<T> {// T t = new T(); // 錯誤:不能直接創建泛型類型的實例
}
靜態成員不能使用類型參數:
public class Box<T> {// private static T content; // 錯誤:靜態變量不能使用類型參數
}
泛型數組創建受限:
public class Box<T> {// T[] array = new T[10]; // 錯誤:不能直接創建泛型數組
}
示例:使用泛型的棧
public class GenericStack<T> {private List<T> stack = new ArrayList<>();public void push(T element) {stack.add(element);}public T pop() {if (!stack.isEmpty()) {return stack.remove(stack.size() - 1);}return null;}public boolean isEmpty() {return stack.isEmpty();}public static void main(String[] args) {GenericStack<String> stringStack = new GenericStack<>();stringStack.push("Hello");stringStack.push("World");System.out.println(stringStack.pop()); // 輸出:WorldGenericStack<Integer> intStack = new GenericStack<>();intStack.push(1);intStack.push(2);System.out.println(intStack.pop()); // 輸出:2}
}
結論
Java 泛型提供了一種類型安全的方式來實現通用編程。它們不僅提高了代碼的可讀性和可維護性,還避免了類型轉換的錯誤。在編寫通用類、接口和方法時,泛型是一個強大的工具。