当前位置:首页 > 文章列表 > 文章 > java教程 > super 关键字与下界通配符实战应用

super 关键字与下界通配符实战应用

2026-05-22 08:48:26 0浏览 收藏
本文深入剖析了Java中常被混淆的两个概念——super关键字与泛型下界通配符? super T,明确指出super仅用于子类访问父类成员(如super()或super.method()),而? super T则是独立的泛型类型约束机制,专为安全写入T及其子类对象到集合设计;文章破除“用super实现下界通配符功能”的常见误解,厘清继承、泛型与通配符的本质区别,并给出正确使用场景与实践要点,助你写出更严谨、可维护的泛型代码。

如何利用 super 关键字实现下界通配符实战向历史兼容的父类集合中注入子类对象变量

super 关键字本身不能直接实现“下界通配符”或“向父类集合注入子类对象”的功能。这是对 Java 泛型、通配符和继承机制的常见误解。下面直接讲清楚关键点和正确做法:

super 和下界通配符(? super T)是两回事

super 是用于在子类中调用父类构造器或方法的关键字,比如 super()super.method()。它不参与泛型类型约束。

? super T 是泛型中的**下界通配符**,用于放宽写入限制,常见于 Collection super T> 这类声明中——它表示“能接受 T 类型或其任意父类的集合”,核心用途是:安全地往集合里 add(T)

历史兼容的父类集合中注入子类对象?看场景

假设你有旧代码:List list = new ArrayList();,现在想往里面加 StringInteger 等子类实例——这完全合法,因为 StringObject 的子类,无需泛型通配符或 super

但如果用泛型增强安全性,正确方式是:

  • 想**读取**时保证类型安全 → 用上界:List extends Number>(只能 get,返回 Number)
  • 想**写入**子类实例 → 用下界:List super Integer>(可以 add(Integer),但 get() 只能当 Object)

实战示例:用 ? super 实现“兼容旧集合”的安全写入

比如有个工具方法,需把一批 BigDecimal 写入一个可能为 ListList 的集合:

public static void addNumbers(List<? super BigDecimal> target, BigDecimal... nums) {
    for (BigDecimal n : nums) {
        target.add(n); // ✅ 安全:BigDecimal 是 Number 和 Object 的子类
    }
}

调用时: