我想不出更好的问题名称,但我希望一个例子能让这个问题变得更简单。
假设我创建自己的自定义
List
(与它的作用无关):
static class MyList<E> extends AbstractList<E> {
@Override
public E get(int index) {
return null;
}
@Override
public int size() {
return 0;
}
}
我现在可以创建它的实例并调用与我覆盖的方法不同的方法:
MyList<String> myList = new MyList<>();
myList.iterator();
当然,
iterator
应该使用我声明的get
方法,但这就是保证吗?这是否意味着 iterator
无法以根本不使用 get
的方式进行更改?
举个更简单的例子,你可以考虑
addAll
。假设我的 MyList
也覆盖了 add
:
@Override
public boolean add(E e) {
return super.add(e); // irrelevant what it does
}
然后我可以做:
myList.addAll(someOtherCollection)
。 addAll
可以实现一个简单的:
for(E e: someOtherCollection) {
// use add that I have overridden
}
但与此同时,实现可以改变,并且根本不使用循环(例如
ArrayList
)。
当然,
iterator
和addAll
在文档中都有一些提及,例如:
此实现返回迭代器接口的简单实现,依赖于后备列表的 size()、get(int) 和 remove(int) 方法。
和
此实现迭代指定的集合,并将迭代器返回的每个对象依次添加到该集合中。
那么这是否意味着这可以不能改变并被视为“规范”?现在我写了这个长问题并重新阅读它,答案可能是明显的“是”。
不,没有这样的保证。这是因为
iterator()
是 Iterable<T>
的一种方法。
可能,也许应该,但不能保证。
您可以查看
ArrayList<T>.addAll()
的实现来了解原因。