提问人:bh w 提问时间:8/31/2022 更新时间:8/31/2022 访问量:50
为什么 AbstractCollection 在使用 Arrays.asList().addAll 时会抛出异常而不是 AbstractList
Why is AbstractCollection throwing exception instead of AbstractList when using Arrays.asList().addAll
问:
我不是在问为什么报告错误,但我认为应该调用它 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)
答:
AbstractList
不重写 addAll(Collection<? extends E>)。
它只是继承了 的方法。如果你去看 的文档,你可以看到它被列为“类中声明的方法”之一。AbstractCollection
AbstractList
addAll
java.util.AbstractCollection
请注意,还有一个在 AbstractList
中声明的 addAll(int, Collection<? extends E>),
但这是一个不同的方法。
- 返回的类型也不会覆盖,这就是为什么您在调用 时在堆栈跟踪中看到 的原因。Arrays.asList
Arrays.ArrayList
addAll(Collection<? extends E>)
AbstractCollection
addAll
另一方面,确实覆盖(但不覆盖),因此当您调用 .AbstractList
add
Arrays.ArrayList
AbstractList
add
评论
addAll
AbstractList
list.addAll(0, tmp)
list.addAll(tmp)