为什么 AbstractCollection 在使用 Arrays.asList().addAll 时会抛出异常而不是 AbstractList

Why is AbstractCollection throwing exception instead of AbstractList when using Arrays.asList().addAll

提问人:bh w 提问时间:8/31/2022 更新时间:8/31/2022 访问量:50

问:

我不是在问为什么报告错误,但我认为应该调用它 AbstractList.addAll 来抛出异常


demo1(看不懂):

public class TestAbstractList {
    public static void main(String[] args) {
        List<String> tmp = new ArrayList<>(
        );
        tmp.add("kk");

        List<String> list = Arrays.asList("3");
        // list.add("kk");
        list.addAll(tmp);
    }
}
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.AbstractList.add(AbstractList.java:108)
    at java.util.**AbstractCollection**.addAll(AbstractCollection.java:344)
    at com.clinbrain.md.metadata.TestAbstractList.main(TestAbstractList.java:15)

根据 Arrays.asList 返回的对象,它的父类是 AbstractList(也称为 addAll)。AbstractList 继承 AbstractCollection。按照 jvm 调用方法(invokeinterface 或 invokevirtual)的原理,抛出异常的应该是 AbstractList.addAll,结果确实是 AbstractCollection.addAll 抛出异常


demo2(可理解):

public class TestAbstractList {
    public static void main(String[] args) {
        List<String> tmp = new ArrayList<>(
        );
        tmp.add("kk");

        List<String> list = Arrays.asList("3");
        list.add("kk");
        // list.addAll(tmp);
    }
}
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(AbstractList.java:148)
    at java.util.**AbstractList**.add(AbstractList.java:108)
    at com.clinbrain.md.metadata.TestAbstractList.main(TestAbstractList.java:14)
Java 数组 异常

评论

0赞 Sotirios Delimanolis 8/31/2022
您能否向我们指出该方法的源代码?addAllAbstractList
0赞 DuncG 8/31/2022
查看与list.addAll(0, tmp)list.addAll(tmp)

答:

2赞 Sweeper 8/31/2022 #1

AbstractList不重写 addAll(Collection<? extends E>)。它只是继承了 的方法。如果你去看 的文档,你可以看到它被列为“类中声明的方法”之一。AbstractCollectionAbstractListaddAlljava.util.AbstractCollection

请注意,还有一个在 AbstractList 中声明addAll(int, Collection<? extends E>),但这是一个不同的方法。

- 返回的类型也不会覆盖,这就是为什么您在调用 时在堆栈跟踪中看到 的原因。Arrays.asListArrays.ArrayListaddAll(Collection<? extends E>)AbstractCollectionaddAll

另一方面,确实覆盖(但不覆盖),因此当您调用 .AbstractListaddArrays.ArrayListAbstractListadd

评论

0赞 bh w 8/31/2022
你是对的!!!我看错了,其实addAll(Collection)在subList类,这个类也在AbstractList文件中,我太粗心了,对不起