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

Why is the iterator method present in both Iterable and Collection interfaces?

Iterable接口有如下方法:

 Iterator<T> iterator();

Collection接口扩展了Iterable,它也声明了同样的方法。

我怀疑在设计 Java 集合时为什么需要两次声明相同的方法?

重定义接口方法是一种常见的做法,它允许子接口细化父接口定义的契约。

Iterableiterator() returns 对某种类型元素的迭代器。

Collectioniterator() returns 对 Collection 元素的迭代器,不保证顺序。

Listiterator() returns 以适当的顺序对 List 的元素进行迭代。

这意味着如果你实现了一些实现了Collection的class的iterator()方法,你应该遵循Collectioniterator()的约定],比 Iterableiterator() 合同更具体。如果您的 class 也实现了 List,您应该遵循 Listiterator().

更具体的约定

一个可能的原因可能是添加的 javadoc 明确了该方法的作用。 Collection 是:

/**
 * Returns an iterator over the elements in this collection.  There are no
 * guarantees concerning the order in which the elements are returned
 * (unless this collection is an instance of some class that provides a
 * guarantee).
 *
 * @return an <tt>Iterator</tt> over the elements in this collection
 */

而对于 Iterable 它 "only" 是:

/**
 * Returns an iterator over elements of type {@code T}.
 *
 * @return an Iterator.
 */

主要原因是Java5.

java.util.Collection 及其 iterator() 方法和 java.util.Iterator 自 Java 1.2.

以来就存在

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

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

因此两个接口都有一个方法iterator() - java.util.Collection 因为它是 "first born", java.lang.Iterable 用于支持增强的for循环。