集合存入對象時上轉為 Object,取出需強轉,易出錯且碼冗餘。
List list = new ArrayList(); list.add("a"); String s = (String)list.get(0);
Listlist = new ArrayList (); // Java 7+ 可寫 new ArrayList<>();
List>
。Throwable 子類(運行時拋異常,編譯期無法確定)。? 解決類型不匹配問題:List 不是 List 的子類,無法傳遞給參數為 List 的方法。
// 使用無界通配符
private static void printList(List> list) {
for (Object o : list) System.out.print(o);
}
// 可傳入 List、List 等任意泛型 List
注意:聲明/創建時不能用 ?,即 List> list = new ArrayList>(); 編譯報錯。
// 只接受 Number 及其子類
private static double avg(List extends Number> list) {
double sum = 0;
for (Number n : list) sum += n.doubleValue();
return sum / list.size();
}
// 調用:avg(intList)、avg(doubleList) 均合法;avg(stringList) 編譯報錯
extends T:上界,讀取安全,不可寫入(除 null)。 super T:下界,寫入安全,讀取只能作為 Object。public class MyGeneric{ private E value; public MyGeneric(E value) { this.value = value; } public E get() { return value; } public void set(E value) { this.value = value; } }
泛型為編碼提供嚴格類型檢查,消除強轉,是類型安全的利器。