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来在运行时获取类型信息,但这通常会使代码更复杂且性能较差。