1.泛型
- 泛型是计算机编程中的一个概念,它允许我们在编写代码时使用一种通用的类型,而不是具体的类型。这样可以提高代码的重用性和灵活性。
- 在Java中,泛型可以应用于类、接口和方法。
- 当创建泛型对象时,需要指定具体的类型。
- 例如,你可以创建一个泛型的列表对象,用来存储整数类型的数据,或者创建一个泛型的队列对象,用来存储字符串类型的数据。
- 泛型的好处是,它可以在编译时进行类型检查,避免了在运行时出现类型错误的问题。这样可以提高代码的稳定性和可靠性。
- 不过,需要注意的是,虽然在编译时可以进行类型检查,但在程序运行时,JVM会擦除泛型类型的信息。
- 也就是说,泛型类型在编译后会被擦除,JVM在运行时并不知道具体的泛型类型是什么。
- 这是因为泛型主要是在编译时起作用,用来提供编译时的类型安全检查,而在运行时并不需要泛型类型信息。
2.类型擦除代码示例:
假设我们有一个泛型类Box<T>
,其中T
是一个类型参数。我们可以在类中定义一个方法来获取Box
对象中的值,并返回该值。代码如下所示:
public class Box<T> {
private T value;
public Box(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}
现在,让我们创建一个Box
对象并获取它的值:
Box<Integer> box = new Box<>(10);
int value = box.getValue();
System.out.println(value);
在这个例子中,我们创建了一个Box
对象,并将一个整数值传递给它的构造函数。然后,我们使用getValue()
方法获取该值,并将其赋给一个整型变量value
。最后,我们将value
打印出来。
在编译时,编译器会将T
替换为擦除类型Object
,因此泛型类Box<T>
实际上会被编译成如下的形式:
public class Box {
private Object value;
public Box(Object value) {
this.value = value;
}
public Object getValue() {
return value;
}
}
这样,在运行时,JVM并不知道Box
类曾经使用过泛型类型T
,而只知道它是一个普通的类,其中的值是Object
类型的。
3.桥方法
- 桥方法是在泛型类型擦除时由编译器自动合成的方法。
- 在Java中,泛型类型的实例方法会在编译时生成桥方法,以确保类型安全性。
- 在泛型类型中,如果父类或接口的方法使用了泛型类型参数,而子类或实现类中的方法使用了具体的类型参数,则编译器会在子类或实现类中生成桥方法来保持类型一致性。
- 桥方法的作用是在类型擦除后,确保子类或实现类的方法与父类或接口的方法具有相同的签名。这样可以避免在使用泛型类型时出现类型不匹配的问题。
桥方法代码示例:
public class MyList<T> {
public void add(T element) {
// 添加元素的实现
}
}
在类型擦除后,编译器会生成以下桥方法:
public class MyList {
public void add(Object element) {
add((T) element);
}
public void add(T element) {
// 添加元素的实现
}
}
这样,在使用泛型类型时,可以确保方法调用时传递的参数类型与泛型类型参数一致。