微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

方法参数之外的有界通配符相反的行为

如何解决方法参数之外的有界通配符相反的行为

在使用有界通配符时,我注意到一些奇怪的行为。当我使用有界通配符作为方法参数时,我看到了预期的行为。此代码采用 RuntimeException 或其子类的列表并打印它们:

public static void foo(List<? extends RuntimeException> exceptions) {
    for (RuntimeException ex : exceptions) {
        System.out.println(ex);
    }
}

当传递未经检查的异常列表时,它会毫无问题地将它们打印出来。

但是,当在方法参数之外使用有界通配符时,它似乎应用了与声明的任何界限相反的内容(如果我写 extends,它被视为 super,反之亦然) .

public static void main(String[] args) {
    List<? extends RuntimeException> arr = new ArrayList<>();
    arr.add(new IllegalArgumentException()); // DOES NOT COMPILE
}

编译器抱怨: java: incompatible types: java.lang.Stringindexoutofboundsexception cannot be converted to capture#1 of ? extends java.lang.RuntimeException

当我将 List<? extends RuntimeException> 更改为 List<? super RuntimeException> 时,当给定 RuntimeException 的子类时,代码编译时不会出错。这与我预期会发生的情况相反。谁能解释一下这种行为?

编辑:不能将任何对象添加到使用有界通配符声明的列表中。第二个示例无法编译,因为它使用的是 add() 方法。解释here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。