You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java下界通配符(? super Number)代码执行逻辑疑问求解

关于下界通配符? super Number的疑惑解答

首先明确下界通配符? super T的核心意义:它表示集合的元素类型是T或者T的任意超类。这一限制的核心目的是保证你可以安全地向集合中添加T及其子类的对象,而非你理解的“只能添加T或其超类对象”。

为什么你的代码能正常执行?

你的myadd方法接收List<? super Number>,往里面添加的1(Integer)、1.0f(Float)、1.1(Double)、3l(Long)都是Number的子类实例。根据Java多态特性,子类实例可以向上转型为父类Number类型,而List<? super Number>的元素类型要么是Number本身,要么是Number的超类(比如Object)——无论哪种情况,Number的子类实例都可以被安全地存入这个集合:

  • 如果集合是List<Number>:子类实例转成Number存入,完全合法;
  • 如果集合是List<Object>:子类实例转成Object存入,同样合法。

纠正你的误解

你混淆了“集合元素的类型”和“可以添加的元素类型”:

  • ? super Number限制的是集合本身的元素类型范围(必须是Number或其超类);
  • 而可以添加的元素,只要是Number的子类(包括Number本身),都能向上转型匹配集合的元素类型,因此是安全的。

反过来,如果用上界通配符? extends Number,就不能向集合中添加这些子类实例——因为集合的元素类型可能是Number的某个具体子类(比如List<Integer>),此时添加Float就会类型不匹配。

关于你代码中的原始类型List

你主方法里的List empty = new ArrayList<>();是原始类型声明,编译器会将其视为List<Object>处理,而Object是Number的超类,完全符合List<? super Number>的参数要求,因此可以传入myadd方法并正常添加元素。

内容的提问来源于stack exchange,提问作者BigIO

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:24:18