J2SE 5.0 引入泛型,徹底改變集合 API 設計方式。本文將演示如何創建支持泛型的自定義類,並以 Queue<E> 為例,構建與 for-each 循環無縫協作的類型安全集合。
public class Example<ONE, TWO, THREE> {
private ONE one;
private TWO two;
private THREE three;
public ONE getOne() { return one; }
public void setOne(ONE one) { this.one = one; }
// ... 其餘 getter/setter 省略
public static void main(String[] args) {
// 實例化時指定具體類型
Example<Double, Integer, String> ex = new Example<Double, Integer, String>();
ex.setOne(1.5);
ex.setTwo(2);
ex.setThree("Three");
}
}
<ONE, TWO, THREE> 為類型參數(佔位符)Object,失去類型安全public <T> void print(T obj) {
System.out.println(obj);
}
// 調用時編譯器自動推斷 T 類型
print("Hello"); // T 推斷為 String
print(123); // T 推斷為 Integer
push(E)、pop()、size()、isEmpty()、clear()ArrayList<E> 存儲QueueException 而非返回 nullpackage com.heatonresearch.examples.collections;
import java.util.*;
public class Queue<E> {
private final ArrayList<E> list = new ArrayList<E>();
public void push(E obj) {
list.add(obj);
}
public E pop() throws QueueException {
if (size() == 0) {
throw new QueueException("Queue is empty");
}
E result = list.get(0);
list.remove(0);
return result;
}
public boolean isEmpty() {
return list.isEmpty();
}
public int size() {
return list.size();
}
public void clear() {
list.clear();
}
}
// 自定義異常
class QueueException extends Exception {
public QueueException(String msg) { super(msg); }
}
Queue<String> q = new Queue<String>();
q.push("A");
q.push("B");
q.push("C");
while (!q.isEmpty()) {
System.out.println(q.pop()); // 輸出 A, B, C
}
// 配合 for-each 循環(需實現 Iterable<E>)
// 此處為演示,Queue 未實現 Iterable,若實現則可:
// for (String s : q) { ... }
// 源碼
for (String s : list) { ... }
// 編譯器生成等價字節碼
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
...
}
for (int i=0; i<arr.length; i++)Iterator 遍歷foreach/in 關鍵字for 復用現有關鍵字,避免破壞現有代碼中變量名 foreach/inin 常用作 System.in 等標識符,引入關鍵字衝突風險極大: 在語法上無歧義,且類似數學「屬於」符號Queue<String> 與 Queue<Integer> 共用同一 Class 對象new E[10]、不可 instanceof 具體泛型類型List<E>、Set<E>、Map<K,V> 接口而非實現類Iterable<E> 以支持 for-each<? extends T>/<? super T> 靈活處理協變/逆變場景-Xlint:unchecked 檢查泛型將類型安全從運行時前移至編譯期,自定義泛型集合僅需在類聲明添加 <E>、內部集合泛化、方法簽名參數化。結合 for-each、Iterable、通配符等特性,即可構建出與 JDK 集合框架無縫融合的高質量組件。建議在項目中全面推行泛型化重構,消除 ClassCastException 隱患,提升代碼可讀性與重構安全性。