今天要學 Generics(泛型)把 ArrayList 抽象成可重用容器,然後明天實作。
首先為什麼要用 Generics?
Type safety:在編譯期就能檢查型別錯誤。
Reusable:同一份管理邏輯,能管理 Student、Teacher、Course…
避免重複:不用為每個類別都寫一份 XxxManager
然後what is Generics?
Generics 是 Java 提供的一種語法,允許你在定義類別或方法時,不指定確切型別,而是用一個「型別參數 (Type Parameter)」來代表。
使用時再決定具體型別。
這讓程式碼 更安全(避免型別錯誤)且 更可重用(不用重寫多份)。
ArrayList list = new ArrayList(); // 原始類型
list.add("Tom");
list.add(18); // 可以放不同型別!會出問題
String name = (String) list.get(0); // 需要強制轉型
問題:
任何型別都能丟進去 → 失去型別安全性。
取出來要自己轉型,很容易出錯。
有泛型的情況
ArrayList list = new ArrayList<>();
list.add("Tom");
list.add(18); 編譯錯誤,因為只允許 String
String name = list.get(0); // 不需要轉型
好處:
型別安全:編譯期就能檢查型別錯誤。
免轉型:取出來的型別自動正確。
可重用:同一份 ArrayList,可以用在 String、Integer、Student 等任何型別。
(Generic Class);
public class Box {
private T item;
public void set(T item) { this.item = item; }
public T get() { return item; }
}
使用:
Box b1 = new Box<>();
b1.set("Hello");
System.out.println(b1.get()); // Hello
Box b2 = new Box<>();
b2.set(123);
System.out.println(b2.get()); // 123
泛型方法 (Generic Method)
public class Util {
public static void printTwice(T value) {
System.out.println(value);
System.out.println(value);
}
}
Util.printTwice("Hi"); // Hi
Util.printTwice(100); // 100
與這個project的關聯
原本我們的 StudentManager 只能處理 ArrayList。
一旦要處理 Teacher、Course,就得重寫類似的 Manager。
有了 Generics,我們把它重構成 GenericRepo,只要換 T 的型別就能重用。
這讓「學生管理系統」進化為 更通用的資料管理系統,符合軟體工程「可重用性」的核心精神。
總結來說(Generics) = 用型別參數替代具體型別,讓程式更安全、更通用、更好維護。