8

使用 C#,我开始喜欢它的IEnumerable<T>界面。在很多情况下,这就是您想要放弃和接受的全部内容。此外,它在 .Net 库中也很有用。例如,您在List<T>类上有一个构造函数,该构造函数采用IEnumerable<T>.

我现在必须使用Java,我自然想使用等效的Iterable<T>接口。但是,我似乎无法在任何地方使用它。一切似乎都在使用扩展Collection<T>接口。为什么是这样?

例如,您有一个ArrayList<T>构造函数,它采用Collection<T>

按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。

为什么不直接取一个Iterable<T>呢?

4

3 回答 3

5

Iterable 仅在 Java 5 中添加。这意味着较旧的方法(大多数)使用集合。甚至可以采用 Iterable 的较新方法也没有使用它。:(

我认为问题在于大多数 Iterable 都是 Collections。

于 2011-05-11T11:28:40.897 回答
2

例如,您有一个 ArrayList 构造函数,它接受一个 Collection

具有可预测的大小是好的,尤其是。对于 ArrayList(它确实使用 toArray() 来构建其底层 Object[])

按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。

可爱的 sun 懒得再次更新文档,它根本不使用迭代器;实际上,我自己几乎从未阅读过这些文档,因为它们往往要么被误导,要么就是完全错误。

您还可以通过子类化 AbstractCollection 轻松地将 Iterable 适合 Collection (仅缺少易于实现的 size() 和 iterator() )

引入 Iterable 主要是为了符合foreach构造。

于 2011-05-11T11:34:11.467 回答
0

因为他们希望允许对集合做更多的事情而不仅仅是迭代它?

于 2011-05-12T00:17:11.903 回答