泛型的概念是允許你在定義(類別、方法、介面等)時不指定具體型態,可先用參數來定義,實際使用時再根據需求指定型態,這樣可以增強程式的靈活性和重用性。
在 Java 泛型中,<> 內可以放置封裝類別、自定義類別、介面以及其他泛型類別的型態參數。但是,不能直接使用基本資料型態(如 int、double)作為泛型參數,必須使用對應的封裝類別(如 Integer、Double 等)。
非泛型的範例:
public class Box {
private Integer value;
public void set(Integer value) {
this.value = value;
}
public Integer get() {
return value;
}
}
泛型的範例:
public class Box<T> {
private T value;
public void set(T value) {
this.value = value;
}
public T get() {
return value;
}
}
這裡的 Box 是一個典型的泛型類別,T 代表一個任意的資料型態。當你使用這個類別時,你可以指定具體的型態,例如 Integer、String 或任何其他型態:
Box<Integer> intBox = new Box<>();
intBox.set(123);
Box<String> strBox = new Box<>();
strBox.set("Hello");
使用泛型的例子讓 Box 類別能夠被重用於不同的型態,而不需要針對每一種型態去撰寫單獨的類別。
如果沒有使用泛型,Java 編譯器會將未定義型別的變數視為 Object 型別,這是因為在 Java 中,Object 是所有類別的父類別。
如果有使用泛型,在使用該類別的時候必須指定具體的型別。編譯器會在編譯時期檢查型別,這樣可以在編譯階段就發現型別不匹配的問題,避免在運行時出現類型轉換異常的錯誤。
泛型的使用範圍很廣,主要包括類別(class)、介面(interface)、方法(method)等。
以下是泛型方法的範例:
import java.util.List;
public class GenericMethodExample {
// 泛型方法
public static <T> void printList(List<T> list) {
for (T element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
// 使用泛型方法印出不同型別的list
List<String> stringList = List.of("Apple", "Banana", "Cherry");
printList(stringList); // output:Apple Banana Cherry
List<Integer> intList = List.of(1, 2, 3, 4, 5);
printList(intList); // output:1 2 3 4 5
}
}