AbstractList 保证溢出到其他方法中

问题描述 投票:0回答:1

我想不出更好的问题名称,但我希望一个例子能让这个问题变得更简单。

假设我创建自己的自定义

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) 方法。

此实现迭代指定的集合,并将迭代器返回的每个对象依次添加到该集合中。

那么这是否意味着这可以不能改变并被视为“规范”?现在我写了这个长问题并重新阅读它,答案可能是明显的“是”。

java collections iterator
1个回答
0
投票

不,没有这样的保证。这是因为

iterator()
Iterable<T>
的一种方法。

可能,也许应该,但不能保证。

您可以查看

ArrayList<T>.addAll()
的实现来了解原因。

© www.soinside.com 2019 - 2024. All rights reserved.