为什么迭代器方法同时存在于Iterable和Collection接口中?

时间:2018-07-08 13:16:19

标签: java collections iterable

Iterable界面具有以下方法:

 Iterator<T> iterator();

Collection接口扩展了Iterable,并且还声明了相同的方法。

我怀疑在设计Java集合时需要两次重复相同的方法声明吗?

3 个答案:

答案 0 :(得分:4)

一个可能的原因可能是添加的javadoc清楚说明了该方法在做什么。对于Collection,它是:

Collection

对于iterator(),它“仅”是:

Iterable

答案 1 :(得分:3)

重新定义接口方法是一种常见的做法,它允许子接口完善由超级接口定义的协定。

let obj={ a:1, b: 12, c: 2 } 的{​​{1}}返回某种类型元素上的迭代器。

arr = [{a:1},{c:2},{b:12}] 的{​​{1}}返回Iterable元素上的迭代器,但不保证顺序。

iterator()的{​​{1}}返回Collection元素上正确顺序的迭代器。

这意味着,如果您实现某个实现iterator()的类的Collection方法,则应遵循List的{​​{1}}的约定比iterator()的{​​{1}}合同要高。如果您的课程还实现了List,则应遵循iterator()的{​​{1}}的更为具体的约定。

答案 2 :(得分:3)

主要原因是Java 5。

java.util.Collection及其iterator()方法和java.util.Iterator自Java 1.2起就存在。

当他们想在Java 5中引入增强的for循环(一个for (String s: ...) {}时,他们需要一种从未实现java.util.Iterator的类中创建java.util.Collection的方法。引入了一个新的接口java.lang.Iterable,该接口可以由所有希望支持增强的for循环的类实现。

为了使现有的java.util.Collection及其所有后代接口和类与增强的for循环兼容,他们使java.util.Collection扩展了java.lang.Iterable

因此,这两个接口都具有方法iterator()-java.util.Collection,因为它是支持增强的for循环的“第一个出生” java.lang.Iterable