JAVA泛型的继承和实现
在Java中,泛型具有继承和实现的特性,并且是协变的。这意味着如果一个类A继承自类B,那么从类B继承下来的所有泛型类型,都可以在类A中使用。下面以一个例子来说明:
public class Animal {
}
public class Cat extends Animal {
}
public class Box<T> {
private T t;
public Box(T t) {
this.t = t;
}
public T get() {
return t;
}
}
public class CatBox extends Box<Cat> {
public CatBox(Cat cat) {
super(cat);
}
}
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
Cat cat = new Cat();
CatBox catBox = new CatBox(cat);
// 父类引用指向子类对象
Box<Animal> animalBox = catBox;
Animal animalFromBox = animalBox.get(); // 因为泛型类型协变,所以可以返回Animal类型
System.out.println(animalFromBox.getClass().getSimpleName()); // 输出 Cat
}
}
上面的例子中,我们定义了一个Box类,该类使用泛型T来表示存储的对象的类型。然后,我们定义了一个CatBox类,它继承自Box
擦除原理解析
Java泛型的实现是通过类型擦除来实现的。类型擦除是在编译期间实现的,具体实现方式是将所有泛型类型替换为它们的边界类型或Object类型,并插入必要的强制类型转换。下面通过两个示例来说明:
示例一
public class Box<T> {
private T t;
public void set(T t){
this.t = t;
}
public T get() {
return t;
}
public static void main(String[] args) {
Box<Integer> box = new Box<>();
box.set(10);
int i = box.get(); // 此处实际上还需要进行类型转换为 int,但由于自动拆箱,因此可以忽略
System.out.println(i);
}
}
在上面的示例中,我们定义了一个Box类,该类使用泛型T来表示存储的对象的类型。然后,我们在main方法中创建了一个Box
示例二
public class Test {
public static void main(String[] args) {
List<String> list1 = new ArrayList<>();
List<Integer> list2 = new ArrayList<>();
System.out.println(list1.getClass().equals(list2.getClass())); // true
}
}
在上面的示例中,我们定义了两个不同类型的List:一个是存储String类型的List,一个是存储Integer类型的List,两个List对象的Class类型是相同的,这是由于Java泛型使用了类型擦除所导致的,泛型类型T被擦除后,实际上变成了相同的原始类型。这也是为什么在Java泛型中,无论是List
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA泛型的继承和实现、擦除原理解析 - Python技术站