m1()
调用不会抛出任何运行时异常,而是正确执行。
但是,根据我的理解,它应该通过例外 - RuntimeException类不能自我扩展。
class Test1{
public static void main(String[] args) {
List<RuntimeException> l = new ArrayList<>();
l.add(new IllegalArgumentException());
l.add(new RuntimeException());
m1(l);
}
public static void m1(List<? extends RuntimeException> l) {
for (RuntimeException a : l)
System.out.println(a);
}
}
有人可以帮助我理解这种行为。
答案 0 :(得分:0)
<强>? extends T被称为上限
The upper bounded wildcard, <? extends Foo>, where Foo is any type, matches Foo and any subtype of Foo. The process method can access the list elements as type Foo:
public static void process(List<? extends Foo> list) {
for (Foo elem : list) {
// ...
}
}
希望这是有道理的,因为T是匹配T和T
的任何子类型的任何类型答案 1 :(得分:0)
您的功能可以按如下方式重写:
public <T extends RuntimeException> static void m1(List<T> l) {
for (T a : l)
System.out.println(a);
}
}
现在更清楚的是类型T
未知,但它继承了RuntimeException
的特征。
但是你在这里有一个通配符有界类型:? extends RuntimeException
。那么如何迭代和检索对象?
所有你知道的是,无论它在里面,它都有RuntimeException
的特征,所以这就是你使用的原因
for (RuntimeException a : l) { ... }
你不能for (Exception a : l)
超过List<RuntimeException>
,因为这会打开(例如)IOException
s的大门,而不是RuntimeException
。
但你可以public static void m1(List<? extends Exception> l);
并将List<RuntimeException>
传递给你;但你需要用for (Exception a : l)
迭代它。
你也可以在instanceof
的帮助下查看它。
RuntimeException instanceof RuntimeException
?是的,虽然它不是子类。