【发布时间】:2018-12-16 08:37:54
【问题描述】:
Iterable接口有如下方法:
Iterator<T> iterator();
Collection 接口扩展了Iterable,它也声明了相同的方法。
我怀疑在设计 Java 集合时两次放置相同的方法声明有什么需要?
【问题讨论】:
标签: java collections iterable
Iterable接口有如下方法:
Iterator<T> iterator();
Collection 接口扩展了Iterable,它也声明了相同的方法。
我怀疑在设计 Java 集合时两次放置相同的方法声明有什么需要?
【问题讨论】:
标签: java collections iterable
一个可能的原因可能是添加的 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,它“唯一”是:
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
【讨论】:
重新定义接口方法是一种常见的做法,它允许子接口细化由超接口定义的契约。
Iterable 的iterator() 返回某种类型元素的迭代器。
Collection 的iterator() 在不保证顺序的情况下返回Collection 元素的迭代器。
List 的iterator() 以正确的顺序在List 的元素上返回一个迭代器。
这意味着如果你实现了某个实现Collection的类的iterator()方法,你应该遵循Collection的iterator()的约定,比Iterable的@987654334更具体@ 合同。如果你的类也实现了List,你应该遵循List的iterator()的更具体的契约。
【讨论】:
主要原因是 Java 5。
java.util.Collection 及其 iterator() 方法和 java.util.Iterator 自 Java 1.2 起就存在。
当他们想在 Java 5 中引入增强的 for 循环(for (String s: ...) {})时,他们需要一种方法来从不实现 java.util.Collection 的类创建 java.util.Iterator。决定引入一个新的接口java.lang.Iterable 可以被所有想要支持增强的for循环的类实现。
为了使现有的 java.util.Collection 及其所有派生接口和类与增强的 for 循环兼容,他们使 java.util.Collection 扩展 java.lang.Iterable。
因此,两个接口都有一个方法iterator() - java.util.Collection,因为它是“初生者”,java.lang.Iterable 用于支持增强的 for 循环。
【讨论】: