📅  最后修改于: 2023-12-03 15:16:36.132000             🧑  作者: Mango
Java泛型是在JDK1.5中引入的,它通过使用泛型参数来提高代码的安全性、可读性和可重用性。然而,Java泛型中存在一种叫做“类型擦除”的机制,它在编译期间会将泛型的类型擦除掉,以便在运行时更好地支持Java虚拟机。
泛型类型擦除是指在编译期间,Java编译器会将所有泛型类型都替换为它们的原始类型,并在必要时插入强制类型转换。这意味着在运行时,泛型信息不再存在,因为泛型类型信息已被擦除。
例如,下面的代码:
public class Test<T> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
在编译期间,它将被转换为:
public class Test {
private Object value;
public void setValue(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
}
泛型类型T被替换为Object类型,并且编译器插入了一些强制类型转换。
泛型类型边界是指对泛型参数类型的限制条件。在Java泛型中,我们可以使用extends关键字来定义泛型参数的类型边界。例如:
public class Test<T extends Number> {
private T value;
public void setValue(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
这里泛型参数T被限制为Number类或其子类。然而,在编译器擦除泛型类型信息时,泛型边界也会被擦除。
例如,上面的代码在编译期间将被转换为:
public class Test {
private Number value;
public void setValue(Number value) {
this.value = value;
}
public Number getValue() {
return value;
}
}
注意,泛型参数T的类型边界被替换为了Number类型,并且没有相关的泛型信息。
泛型擦除对Java程序的影响主要有两个:
Java泛型中的类型擦除是一种编译器优化机制,它可以减少Java虚拟机的压力,并提高程序的运行时性能。虽然泛型类型信息在编译期间被擦除了,但在运行时仍然可以使用泛型。因此,我们可以利用泛型来提高代码的可读性和可重用性。