Iterable
界面具有以下方法:
Iterator<T> iterator();
Collection
接口扩展了Iterable
,并且还声明了相同的方法。
我怀疑在设计Java集合时需要两次重复相同的方法声明吗?
答案 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
。