Java泛型(Generics)是JDK 1.5引入的一個新特性,它允許你在編譯時期為類、接口和方法定義類型參數。泛型的主要目的是提高代碼的可重用性和類型安全。通過使用泛型,你可以編寫一個適用于各種數據類型的通用代碼,而無需為每種數據類型編寫單獨的代碼。
然而,Java泛型在運行時會擦除(Type Erasure)。這意味著在編譯后的字節碼中,泛型類型信息會被刪除,替換為它們的限定類型或限定類型的限定者(通常是Object)或者限定類型的限定者的限定者。這是為了確保與舊版Java代碼的兼容性。
例如,以下泛型類限制了類型參數T必須是Number或其子類:
public class NumericBox<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
在編譯后,NumericBox類變為:
public class NumericBox {
private Object value;
public void setValue(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
}
類型擦除確保了NumericBox類可以與舊版Java代碼兼容,但它也意味著你不能在運行時查詢NumericBox實例的具體類型參數。例如,你不能使用instanceof
操作符檢查NumericBox是否包含一個特定類型的值,因為編譯器在運行時不會保留泛型類型信息。為了解決這個問題,Java提供了反射API來在運行時獲取類型信息,但這通常會使代碼更復雜且性能較差。