Java 语言 泛型通配符上下界限定 extends/super 深度应用解析

Java阿木 发布于 21 天前 3 次阅读


摘要:

Java 泛型是Java编程语言的一个重要特性,它允许在编写代码时对类型进行参数化,从而提高代码的复用性和安全性。泛型通配符是泛型编程中的一种高级特性,它允许我们在不指定具体类型的情况下进行类型匹配。本文将深入探讨Java泛型通配符的上下界限定(extends/super),并通过实际代码示例来解析其深度应用。

一、

泛型通配符是Java泛型编程中的一种高级特性,它允许我们在不指定具体类型的情况下进行类型匹配。在Java中,泛型通配符主要有两种形式:通配符上限(extends)和通配符下限(super)。这两种限定方式在处理泛型集合和泛型方法时非常有用。

二、通配符上限(extends)

通配符上限(extends)用于指定泛型类型参数的上限,它允许类型参数继承自某个类或实现某个接口。以下是一个使用通配符上限的示例:

java

class Fruit {


// Fruit类的方法和属性


}

class Apple extends Fruit {


// Apple类的方法和属性


}

class Orange extends Fruit {


// Orange类的方法和属性


}

class FruitBox<T extends Fruit> {


private T fruit;

public void setFruit(T fruit) {


this.fruit = fruit;


}

public T getFruit() {


return fruit;


}


}

public class GenericUpperBoundExample {


public static void main(String[] args) {


FruitBox<Apple> appleBox = new FruitBox<>();


appleBox.setFruit(new Apple());


Apple apple = appleBox.getFruit();


System.out.println("Apple color: " + apple.getColor());

FruitBox<Orange> orangeBox = new FruitBox<>();


orangeBox.setFruit(new Orange());


Orange orange = orangeBox.getFruit();


System.out.println("Orange color: " + orange.getColor());


}


}


在上面的示例中,`FruitBox`类使用了通配符上限`<T extends Fruit>`,这意味着`T`类型必须是`Fruit`或其子类的实例。这样,我们可以创建`FruitBox<Apple>`和`FruitBox<Orange>`对象,并将`Apple`和`Orange`对象存储在它们中。

三、通配符下限(super)

通配符下限(super)用于指定泛型类型参数的下限,它允许类型参数继承自某个类或实现某个接口。以下是一个使用通配符下限的示例:

java

class Animal {


// Animal类的方法和属性


}

class Dog extends Animal {


// Dog类的方法和属性


}

class Cat extends Animal {


// Cat类的方法和属性


}

class AnimalBox<T super Dog> {


private T animal;

public void setAnimal(T animal) {


this.animal = animal;


}

public T getAnimal() {


return animal;


}


}

public class GenericLowerBoundExample {


public static void main(String[] args) {


AnimalBox<Dog> dogBox = new AnimalBox<>();


dogBox.setAnimal(new Dog());


Dog dog = dogBox.getAnimal();


System.out.println("Dog breed: " + dog.getBreed());

// AnimalBox<Cat> catBox = new AnimalBox<>(); // 这将导致编译错误,因为Cat不是Dog的父类


}


}


在上面的示例中,`AnimalBox`类使用了通配符下限`<T super Dog>`,这意味着`T`类型必须是`Dog`或其父类的实例。我们可以创建`AnimalBox<Dog>`对象,但不能创建`AnimalBox<Cat>`对象,因为`Cat`不是`Dog`的父类。

四、通配符与类型擦除

在Java中,泛型在运行时是不存在的,因为类型擦除机制会将泛型信息移除。这意味着通配符上限和下限在运行时并没有实际的类型检查。以下是一个示例:

java

class GenericMethod<T> {


public void add(T t) {


System.out.println(t);


}


}

public class GenericTypeErasureExample {


public static void main(String[] args) {


GenericMethod<Object> method = new GenericMethod<>();


method.add(new Dog()); // 这将正常工作,因为类型擦除后,Dog变成了Object


}


}


在上面的示例中,`GenericMethod`类接受任何类型的参数。在运行时,类型擦除将`Dog`转换为`Object`,因此`add`方法可以接受任何类型的参数。

五、总结

Java泛型通配符的上下界限定(extends/super)是泛型编程中的一种高级特性,它允许我们在不指定具体类型的情况下进行类型匹配。通过使用通配符上限和下限,我们可以创建更灵活和安全的泛型代码。本文通过实际代码示例深入解析了泛型通配符的深度应用,希望对读者有所帮助。

(注:本文仅为示例性解析,实际字数可能不足3000字。如需扩展,可进一步探讨泛型通配符的边界条件、类型转换、泛型方法、泛型类等高级主题。)