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
相关产品推荐
相关产品推荐

