具有异常的通用列表无法按预期工作

时间:2018-05-02 11:03:10

标签: java generics

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);
    }

}

有人可以帮助我理解这种行为。

2 个答案:

答案 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?是的,虽然它不是子类。