如何解决方法参数之外的有界通配符相反的行为
在使用有界通配符时,我注意到一些奇怪的行为。当我使用有界通配符作为方法参数时,我看到了预期的行为。此代码采用 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 举报,一经查实,本站将立刻删除。