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



我不是在问为什么报告错误,但我认为应该调用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,结果确实是Abstract Collection.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"中声明的方法;。

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

Arrays.asList-Arrays.ArrayList返回的类型也不会覆盖addAll(Collection<? extends E>),这就是为什么在调用addAll时在堆栈跟踪中会看到AbstractCollection

另一方面,AbstractList确实覆盖了add(但Arrays.ArrayList没有(,因此在调用add时可以看到AbstractList

相关内容

  • 没有找到相关文章

最新更新