【发布时间】:2011-08-02 01:02:44
【问题描述】:
Iterable<E> 在java.lang 中,而Iterator<E> 在java.util 中。这样做有充分的理由,还是仅仅是糟糕设计的产物?
这似乎很奇怪,因为Iterable<E> 的唯一好处是提供Iterator<E>。
编辑:一个潜在的原因是(当时)新引入的 for-each 循环。我想我的问题是,它们是等价的吗?
for(Object o : collection)
...
vs
for( Iterator iter = collection.iterator(); iter.hasNext(); ) {
o = iter.next();
...
如果是,那么这仍然不能解释为什么这两个类位于不同的包中,因为编译器无论如何都必须导入 java.util 才能使用 Iterator 构造。
【问题讨论】:
-
我认为如果他们可以从头开始做所有事情,Iterator 将与 Iterable 一起在 java.lang 中。但正如 duffymo 所说,它从 1.2 开始就在 util 中,你不能真正兼容地将类/接口移动到另一个位置。
-
@Paulo,如果他们愿意,他们可以拥有: interface java.lang.Iterator2;接口 java.util.Iterator 扩展了 java.lang.Iterator2
-
@Paŭlo,实际上它们不会在 java lang 中,在 java.lang 和 java.util.iterator 中放置另一个具有相同方法(next/hasNext)的接口同样容易扩展它。 Doh,Dilum 的评论也是这样,我没注意到。
-
编译器必须导入 java.util 才能使用 Iterator 构造。 编译器从不导入任何东西,它是编写代码的那个。
for (E e: iterable)确实需要额外的导入,这将是您问题的答案。 -
@bestsss:实际上,在
for循环中不需要remove方法是第二个 Iterator 接口的一个很好的论据。