为何带下界通配符<? super IOException>的List添加Exception会编译错误
为什么
List<? super IOException>不能添加Exception实例? 嘿,这个问题问得特别到位,正好戳中了Java泛型下界通配符最容易让人困惑的地方!咱们一步步拆解清楚:
首先得明确List<? super IOException>到底意味着什么——这个引用可以指向任何以IOException的超类作为泛型参数的List实例,比如:
new ArrayList<IOException>()(泛型是IOException本身)new ArrayList<Exception>()(泛型是IOException的直接超类)new ArrayList<Object>()(泛型是所有类的父类)
接下来咱们逐个分析你的代码里的add操作:
exceptions.add(new Exception())→ 编译错误:编译器没办法确定exceptions实际指向的是哪一种List。举个极端情况,如果它实际指向的是ArrayList<IOException>,那这个列表只能装IOException及其子类,而Exception是IOException的超类,根本塞不进去!编译器必须保证所有可能的场景都类型安全,所以它会直接禁止这种存在风险的操作。exceptions.add(new IOException())→ 正常编译:不管这个List实际是哪种类型,IOException都是泛型参数的子类(或者就是泛型参数本身),所以放进任何符合? super IOException的List里都不会有问题。exceptions.add(new FileNotFoundException())→ 正常编译:FileNotFoundException是IOException的子类,自然也能被所有IOException的超类的List接受,所以完全安全。
总结一下下界通配符? super T的核心规则:你只能往里面添加T或者T的子类,因为这些类型一定是所有T的超类的子类,能适配任何可能的实际List实例。而T的超类则不行,因为你没法保证实际List的泛型参数足够“宽泛”到能容纳它。
内容的提问来源于stack exchange,提问作者iamcrypticcoder
相关产品推荐
相关产品推荐

