泛型擦除是什麼意思

在Java程式語言中,泛型(Generics)是一種類型參數化技術,它允許在類、接口和方法的聲明中使用類型占位符(Type Parameters)。泛型可以提高代碼的類型安全性和可重用性,因為編譯器可以確保在編譯時使用泛型的代碼是類型安全的。

然而,Java的泛型實現採用了一種叫做「擦除」(Erasure)的技術。這意味著在編譯過程中,所有的類型參數信息都會被刪除,即從編譯後的位元組碼中移除。這個過程被稱為泛型擦除。

簡而言之,泛型擦除意味著:

  1. 編譯器在編譯時使用類型參數來檢查類型安全性。
  2. 一旦代碼被編譯,所有的類型參數信息都會被擦除,剩下的代碼與沒有使用泛型的代碼在運行時是相同的。
  3. 因此,在運行時,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 類型。這就是泛型擦除的工作方式。