Java通配符<? super Number>指向超类还是子类?附代码编译疑问
关于Java泛型下界通配符
<? super T>的困惑与澄清 问题背景
- 此问题曾被判定为PECS问题的重复项而关闭,但PECS作为助记符弊大于利——人们往往死记硬背却未理解深层逻辑,因此请求重开。
理解更新
从@rzswitzerloot的解释中我理解到:通配符仅指代集合中元素的类型,并不意味着可以向集合中添加通配符类型——实际上只能添加该类型的子类(包括自身,此处为B)。
核心困惑
我对通配符<? super Number>到底指代Number的超类(比如Object)还是子类(比如Integer)感到困惑。在Jeanne Boyarsky与Scott Selikoff所著的《Java OCP 17开发者完全学习指南》(第9章 集合与泛型)中提到:
泛型允许指定通配符。
<?>是无界通配符,表示任意类型。<? extends Object>是上界通配符,表示Object或其子类的任意类型。<? extends MyInterface>表示实现MyInterface的任意类型。<? super Number>是下界通配符,表示Number或其超类的任意类型。尝试向无界或上界通配符的列表中添加元素会导致编译错误。
我理解<? super B>应该代表B的超类(比如A),但为何以下代码无法通过编译?
代码示例
import java.util.ArrayList; import java.util.List; public class Bewildered { static class A {} static class B extends A {} static class C extends B {} public static void main(String[] args) { List<? super B> listBs = new ArrayList<>(); listBs.add(new A()); } }
编译错误信息
java: incompatible types: Bewildered.A cannot be converted to capture#1 of ? super Bewildered.B
内容的提问来源于stack exchange,提问作者likejudo
相关产品推荐
相关产品推荐

