我不是在问为什么报告错误,但我认为应该调用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
。