为什么在 Iterable 和 Collection 接口中都存在迭代器方法?
Why is the iterator method present in both Iterable and Collection interfaces?
Iterable
接口有如下方法:
Iterator<T> iterator();
Collection
接口扩展了Iterable
,它也声明了同样的方法。
我怀疑在设计 Java 集合时为什么需要两次声明相同的方法?
重定义接口方法是一种常见的做法,它允许子接口细化父接口定义的契约。
Iterable
的 iterator()
returns 对某种类型元素的迭代器。
Collection
的 iterator()
returns 对 Collection
元素的迭代器,不保证顺序。
List
的 iterator()
returns 以适当的顺序对 List
的元素进行迭代。
这意味着如果你实现了一些实现了Collection
的class的iterator()
方法,你应该遵循Collection
的iterator()
的约定],比 Iterable
的 iterator()
合同更具体。如果您的 class 也实现了 List
,您应该遵循 List
的 iterator()
.
更具体的约定
一个可能的原因可能是添加的 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循环。
Iterable
接口有如下方法:
Iterator<T> iterator();
Collection
接口扩展了Iterable
,它也声明了同样的方法。
我怀疑在设计 Java 集合时为什么需要两次声明相同的方法?
重定义接口方法是一种常见的做法,它允许子接口细化父接口定义的契约。
Iterable
的 iterator()
returns 对某种类型元素的迭代器。
Collection
的 iterator()
returns 对 Collection
元素的迭代器,不保证顺序。
List
的 iterator()
returns 以适当的顺序对 List
的元素进行迭代。
这意味着如果你实现了一些实现了Collection
的class的iterator()
方法,你应该遵循Collection
的iterator()
的约定],比 Iterable
的 iterator()
合同更具体。如果您的 class 也实现了 List
,您应该遵循 List
的 iterator()
.
一个可能的原因可能是添加的 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循环。