Java 为什么不';不可计数?

Java 为什么不';不可计数?,java,enumeration,iterable,Java,Enumeration,Iterable,在Java 5及更高版本中,有foreach循环,它神奇地作用于任何实现Iterable: for (Object o : list) { doStuff(o); } 但是,Enumerable仍然没有实现Iterable,这意味着要迭代枚举,必须执行以下操作: for(; e.hasMoreElements() ;) { doStuff(e.nextElement()); } 有人知道为什么枚举仍然没有实现Iterable Edit:作为澄清,我不是在讨论Java API中的语言概

在Java 5及更高版本中,有foreach循环,它神奇地作用于任何实现
Iterable

for (Object o : list) {
  doStuff(o);
}
但是,
Enumerable
仍然没有实现
Iterable
,这意味着要迭代
枚举
,必须执行以下操作:

for(; e.hasMoreElements() ;) {
  doStuff(e.nextElement());
}
有人知道为什么
枚举
仍然没有实现
Iterable


Edit:作为澄清,我不是在讨论Java API中的语言概念,而是在Java API中称为“”的Java特定类

枚举没有被修改为支持Iterable,因为它是一个接口而不是一个具体的类(比如Vector,它被修改为支持Collections接口)

如果枚举更改为支持Iterable,则会破坏许多人的代码。

AFAIK枚举是:

迭代器代替了 Java集合中的枚举 框架


我希望他们使用JSR315将ServletAPI更改为使用迭代器而不是枚举

对于
枚举
来说,实现
Iterable
是没有意义的
Iterable
是迭代器的工厂方法<代码>枚举类似于迭代器,只维护单个枚举的状态

因此,请小心尝试将
枚举
包装为
Iterable
。如果有人给我一个
Iterable
,我会假设我可以重复调用它的
iterator()
,创建任意多的
iterator
实例,并在每个实例上独立迭代。包装的
枚举
将不履行本合同;不要让包装的
枚举
从您自己的代码中逃脱。(顺便说一句,我注意到Java7正是以这种方式违反了预期,也不应该被允许“逃脱”)

枚举
类似于
迭代器
,而不是
Iterable
集合
Iterable
迭代器不可用

你不能这样做:

Vector<X> list = …
Iterator<X> i = list.iterator();
for (X x : i) {
    x.doStuff();
}
向量列表=… 迭代器i=list.Iterator(); 对于(X:i){ x、 doStuff(); }
所以这样做没有意义:

Vector<X> list = …
Enumeration<X> i = list.enumeration();
for (X x : i) {
    x.doStuff();
}
向量列表=… 枚举i=list.Enumeration(); 对于(X:i){ x、 doStuff(); }
没有与
可枚举
等价的
可枚举
。它可以在不破坏任何东西的情况下添加,以便在for循环中工作,但有什么意义呢?如果您能够实现这个新的
Enumerable
接口,为什么不直接实现
Iterable
呢?

作为使用增强for循环的枚举的一种简单且干净的方法,将java.util.Collections.list转换为ArrayList

for (TableColumn col : Collections.list(columnModel.getColumns()) {
(javax.swing.table.TableColumnModel.getColumns返回枚举。)


注意,这可能会稍微降低效率。

如果您希望它在语法上更干净一点,您可以使用:

while(e.hasMoreElements()) {
  doStuff(e.nextElement());
}

尽管如此,既然Iterable和Array都有各自的支持,为什么sun不也包括Enumerable呢?@Adrian Kuhn:他们没有包括对迭代器的每个支持,Enumerable的行为就像迭代器,而不是Iterable。枚举不是Iterable。Enumeratrion实际上是迭代器(但不带“delete”)。有了这个澄清,答案是这将打破现有的API。如果允许在接口(如Scala traits)中部分实现,则可以向后兼容地执行此操作。@PetrGladkikh:但他们仍然没有在Java 8中修复它。@JohnEye即使使用Java 8中的默认方法,也不可能完全实现基于
枚举的
Iterable
。没有什么需要“修复”的
Enumeration
Iterable
不是逻辑上等价的类型,并且
集合中已经提供了一个转换实用程序来正确弥合它们之间的差距。list()
这不应该是块内的doStuff(e.nextElement())吗?有趣的是:这(列模型中的列)这就是我发现这个问题的确切原因。