Java 语言 泛型通配符? extends T和? super T有什么区别

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


摘要:

Java 泛型是Java编程语言的一个重要特性,它允许在编写代码时提供类型信息,而不必在运行时指定具体的类型。泛型通配符是泛型编程中的一种机制,它提供了对类型边界进行限制的能力。本文将深入探讨Java中的两种泛型通配符:? extends T 和 ? super T,分析它们的区别以及在实际编程中的应用。

一、

泛型通配符是Java泛型编程中的一种特殊语法,用于表示未知类型。在Java中,有两种常见的泛型通配符:? extends T 和 ? super T。这两种通配符在类型边界上提供了不同的限制,从而影响了泛型方法的实现和泛型集合的使用。

二、? extends T

? extends T 是一个上界通配符,它表示未知类型至少与T一样是T或其子类。在集合框架中,? extends T 通常用于通配类型参数的上界,允许集合存储任何T或其子类的实例。

1. 示例代码

java

class Animal {}


class Dog extends Animal {}


class Cat extends Animal {}

class Box<T extends Animal> {


T t;


}

public class GenericExample {


public static void main(String[] args) {


Box<Animal> box1 = new Box<>();


box1.t = new Animal();

Box<Dog> box2 = new Box<>();


box2.t = new Dog();

// 下面这行代码会编译错误,因为Dog不是Animal的子类


// Box<Cat> box3 = new Box<>();


// box3.t = new Dog();


}


}


2. 应用场景

- 在集合框架中,如ArrayList、LinkedList等,可以使用? extends T 来指定集合可以存储任何T或其子类的实例。

- 在泛型方法中,可以使用? extends T 来限制参数类型。

三、? super T

? super T 是一个下界通配符,它表示未知类型至少与T一样是T或其父类。在集合框架中,? super T 通常用于通配类型参数的下界,允许集合存储任何T或其父类的实例。

1. 示例代码

java

class Animal {}


class Dog extends Animal {}


class Cat extends Animal {}

class Box<T> {


T t;


}

public class GenericExample {


public static void main(String[] args) {


Box<Animal> box1 = new Box<>();


box1.t = new Animal();

Box<Dog> box2 = new Box<>();


box2.t = new Dog();

// 下面这行代码会编译错误,因为Dog不是Animal的父类


// Box<Cat> box3 = new Box<>();


// box3.t = new Animal();


}


}


2. 应用场景

- 在集合框架中,如ArrayList、LinkedList等,可以使用? super T 来指定集合可以存储任何T或其父类的实例。

- 在泛型方法中,可以使用? super T 来限制参数类型。

四、区别与比较

1. 类型边界

- ? extends T:上界通配符,表示类型至少与T一样是T或其子类。

- ? super T:下界通配符,表示类型至少与T一样是T或其父类。

2. 使用场景

- ? extends T:适用于需要存储或处理子类对象的情况。

- ? super T:适用于需要存储或处理父类对象的情况。

五、总结

Java 泛型通配符 ? extends T 和 ? super T 在类型边界上提供了不同的限制,它们在泛型编程中扮演着重要的角色。通过合理使用这两种通配符,可以增强代码的可读性和可维护性,同时避免运行时类型错误。

在实际编程中,应根据具体需求选择合适的通配符。例如,当需要创建一个可以存储任何Animal或其子类的Box时,应使用? extends Animal;而当需要创建一个可以存储任何Animal或其父类的Box时,应使用? super Animal。

相信读者对Java泛型通配符 ? extends T 和 ? super T 的区别与应用有了更深入的理解。在实际编程中,灵活运用这两种通配符,将有助于提高代码质量和开发效率。