泛型擦除是什麼意思
在Java程式語言中,泛型(Generics)是一種類型參數化技術,它允許在類、接口和方法的聲明中使用類型占位符(Type Parameters)。泛型可以提高代碼的類型安全性和可重用性,因為編譯器可以確保在編譯時使用泛型的代碼是類型安全的。
然而,Java的泛型實現採用了一種叫做「擦除」(Erasure)的技術。這意味著在編譯過程中,所有的類型參數信息都會被刪除,即從編譯後的位元組碼中移除。這個過程被稱為泛型擦除。
簡而言之,泛型擦除意味著:
- 編譯器在編譯時使用類型參數來檢查類型安全性。
- 一旦代碼被編譯,所有的類型參數信息都會被擦除,剩下的代碼與沒有使用泛型的代碼在運行時是相同的。
- 因此,在運行時,Java的泛型是「不可知的」(Type Erasure),這意味著你不能在運行時獲取類型參數的信息。
下面是一個簡單的例子來展示泛型擦除的概念:
class Box<T> {
T item;
public Box(T item) {
this.item = item;
}
public T getItem() {
return item;
}
}
public class GenericErasureExample {
public static void main(String[] args) {
Box<String> box = new Box<>("Hello");
String s = box.getItem(); // 編譯時類型安全檢查
Object obj = box.getItem(); // 運行時,Box<String>被擦除為Box
obj = box; // 運行時,Box<String>被擦除為Box
}
}
在這個例子中,Box<String>
被擦除為 Box
,這意味著在運行時,box
對象和 obj
變數都可以存儲任何類型的對象,而不僅僅是 String
類型。這就是泛型擦除的工作方式。