Java 为什么这么多方法使用集合而不是Iterable?

Java 为什么这么多方法使用集合而不是Iterable?,java,iterable,Java,Iterable,有了C#我开始喜欢IEnumerable界面。在很多情况下,这就是你想要付出和接受的一切。此外,它在.Net库中也很有用。例如,列表类上有一个构造函数,它接受一个IEnumerable 目前我必须使用Java,我自然希望使用等效的Iterable接口。然而,似乎我并不能在任何地方使用它。一切似乎都在使用扩展的集合接口。为什么会这样 例如,ArrayList构造函数接受一个集合: 按照集合迭代器返回的顺序,构造包含指定集合元素的列表 为什么不改为使用Iterable?Iterable只是在Java

有了C#我开始喜欢
IEnumerable
界面。在很多情况下,这就是你想要付出和接受的一切。此外,它在.Net库中也很有用。例如,
列表
类上有一个构造函数,它接受一个
IEnumerable

目前我必须使用Java,我自然希望使用等效的
Iterable
接口。然而,似乎我并不能在任何地方使用它。一切似乎都在使用扩展的
集合
接口。为什么会这样

例如,
ArrayList
构造函数接受一个
集合

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


为什么不改为使用
Iterable

Iterable只是在Java5中添加的。这意味着旧方法(大多数)使用集合。甚至可能需要Iterable的新方法也没有使用它(

我认为问题在于,最值得信赖的是收藏

例如,您有一个接受集合的ArrayList构造函数

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

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

可爱的sun懒得再次更新文档,它根本不使用迭代器; 事实上,我自己几乎从来没有读过这些文件,因为它们往往要么是误导,要么就是大错特错

此外,您还可以通过对AbstractCollection进行子类化(AbstractCollection只缺少易于实现的size()和迭代器()),轻松地将Iterable适配到集合中


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

因为他们希望允许对集合进行更多的操作,而不仅仅是对其进行迭代?

如果我正确阅读文档,
Iterable
确实继承自
集合
,因此,无论何时
集合
,您都应该能够将其发送进来equired。不过我可能弄错了。@Bobby,如果是这样的话,我就不会问这个问题了:P不幸的是,这是另一种方式。@Bobby,这是集合继承Iterable的另一种方式。@bestsss:Oohh…我刚开始使用Java,所以请原谅我的无知。
子接口
这个术语听起来像是从我的名字继承过来的界面,而不是相反的方式…再次阅读文档我现在意识到,
Iterable
被声明为
superinterface
…doh…当然我可以,但我也可以使用Collection。我的问题是我不想使用Collection,因为Collection是Iterable的,Iterable有我所需要的。我已经习惯了尝试使用它总是尽我所能使用slimmest接口,Java强迫我不这样做让我很恼火:你知道什么是恼人的:当你向JDO安装代理(集合/映射)时需要大小,因为它决定了(JDBC)的大小结果,您需要完全读取它或使用可滚动的ResultSet。Iterable也有同样的问题,如果您需要复制内容,则没有可用的大小估计,这会导致性能较差。@bestss-“它根本不使用迭代器”-实际上,这取决于集合对
toArray
的实现是否使用了引擎盖下的迭代器。有些使用迭代器,有些不使用。因此,如果我们学究式,javadoc是不准确的,但是如果您将“被返回”更改为“将被返回”,它是准确的。(FWIW,通过
AbstractList
AbstractCollection
继承其
toArray
方法的所有列表类都使用迭代器。)此外,
toArray()
规范说明:如果此集合保证迭代器返回元素的顺序,则此方法必须以相同的顺序返回元素。因此,如果以某种方式定义了此顺序(并且实现没有违反规范),则它的顺序与迭代器的顺序相同@Stephen,c-tor文档不应该依赖于引擎盖下的详细信息,它显然没有使用迭代器,因此它应该声明它。早在那天就有一个错误,因为一些impl.array.asList(即)没有返回Object[]但某些特定类型并试图添加任意不同的对象导致了ArrayStoreException…Doh忘记了要点:即使arrayList也不使用迭代器。这可能是因为开发人员不知道接口,或者只是“懒惰地”像以前一样使用Collection接口。我认为问题是Iterable只有一个方法不是很有用。大多数时间列表和集合都是作为接口使用的,这些接口具有您可能需要的所有方法。但是,在开发库(如Collections)时我同意最好使用您需要的最具体的接口。既然集合继承自Iterable,那么就可以将它们交换掉吗?@Svish,不破坏现有的已编译库,或者必须将所有方法调用加倍。好吧,但我想它可以在新版本的Java中修复?因为您必须重新编译pile来使用它?据我所知,代码不需要更改,只需要重新编译就可以了?这在返回某些内容时是有意义的,但在将其作为参数时则没有意义。当您将某些内容作为参数时,您应该使用可以使用的最小接口。如果您只需要对集合进行迭代,则应使用In Iterable而不是Collection。@Svish因此这些方法要做的更多是迭代。你没有任何相反的证据。例如
ArrayList.addAll
不需要
add
remove
indexOf
size
等等。
size
可能有助于优化内容,但它应该更有效