【问题标题】:Why is the iterator method present in both Iterable and Collection interfaces? [duplicate]为什么 Iterable 和 Collection 接口中都存在迭代器方法? [复制]
【发布时间】:2018-12-16 08:37:54
【问题描述】:

Iterable接口有如下方法:

 Iterator<T> iterator();

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

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

【问题讨论】:

    标签: java collections iterable


    【解决方案1】:

    一个可能的原因可能是添加的 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.
     */
    

    【讨论】:

      【解决方案2】:

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

      Iterableiterator() 返回某种类型元素的迭代器。

      Collectioniterator() 在不保证顺序的情况下返回Collection 元素的迭代器。

      Listiterator() 以正确的顺序在List 的元素上返回一个迭代器。

      这意味着如果你实现了某个实现Collection的类的iterator()方法,你应该遵循Collectioniterator()的约定,比Iterable的@987654334更具体@ 合同。如果你的类也实现了List,你应该遵循Listiterator()的更具体的契约。

      【讨论】:

        【解决方案3】:

        主要原因是 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 循环。

        【讨论】:

        • 即使我喜欢历史推理,我不明白为什么 他们 在“他们让 java.util.Collection 扩展 java .lang.Iterable”?
        • @luk2302 不删除的原因一定是仍然使用早期版本的旧java代码的向后兼容性。
        猜你喜欢
        • 2017-08-17
        • 2019-11-07
        • 2012-10-17
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-19
        • 1970-01-01
        相关资源
        最近更新 更多