? super T

在Java泛型中,? super T 表示下界通配符(Lower Bounded Wildcard),与 ? extends T(上界通配符)的作用相反。

它的含义是:匹配所有T类型及其父类类型(包括T的直接父类、间接父类,直至Object)。

举个例子:

// 定义类的继承关系
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {}

// 使用下界通配符
List<? super Dog> list;

// 以下赋值都是合法的
list = new ArrayList<Dog>();      // T本身
list = new ArrayList<Mammal>();   // T的父类
list = new ArrayList<Animal>();   // T的间接父类
list = new ArrayList<Object>();   // 最终父类

使用场景与限制

  • 主要用于写入操作,可以安全地向集合中添加T类型及其子类的元素
  • 从集合中读取元素时,只能确定是Object类型(需要强制转换才能得到更具体的类型)

例如:

List<? super Dog> dogs = new ArrayList<Mammal>();
dogs.add(new Dog());       // 合法,可以添加Dog类型
dogs.add(new Puppy());     // 合法,可以添加Dog的子类(假设Puppy extends Dog)

Object obj = dogs.get(0);  // 只能获取到Object类型
Dog dog = (Dog) dogs.get(0);  // 需要强制转换(有风险)

总结

  • ? extends T:适合"读取"场景,限制元素的上限(只能是T及其子类)
  • ? super T:适合"写入"场景,限制元素的下限(只能是T及其父类)

这种区分遵循了"PECS原则":Producer Extends, Consumer Super(生产者用extends,消费者用super)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容