【问题标题】:Enumeration is considered as Iterator by JVM枚举被 JVM 视为迭代器
【发布时间】:2025-11-24 16:45:01
【问题描述】:

我想知道为什么 java.util.Enumeration 被 JVM 视为 java.util.Iterator ?他们没有任何继承关系。

public interface Enumeration<E> {
....
}

public interface Iterator<E> {
...
}

Hashtable<String, Object> hashTable = new Hashtable<>();
hashTable.put("key1", 1);
hashTable.put("key2", 2);
hashTable.put("key3", 3);
Enumeration<Object> enumeration = hashTable.elements();
System.out.println(enumeration instanceof Enumeration);
System.out.println(enumeration instanceof Iterator);// why true here?

【问题讨论】:

  • 如果要调查类型关系,请使用X.class.isAssignableFrom( Y.class )。它不会被对象的偶然性所污染。

标签: java iterator java-7 enumeration


【解决方案1】:

instanceof 运算符将对象与指定的类型进行比较。

由于返回的Enumarator实现了Iterator类型,所以条件变成了true

 private class Enumerator<T> implements Enumeration<T>, Iterator<T>

这里是HashTable's Enumerator&lt;T&gt;定义的源代码。

【讨论】:

  • 难题的关键在于instanceof 检查对象的实际类型,而不是变量的声明类型。这其实就是instanceof的目的,不然就没什么用了:)
【解决方案2】:

迭代器和枚举是接口。它们是声明,不能被实例化。因此,无论 elements() 返回什么,它都将是实现 Enumeration 接口的实例化。

如果您查看 Hashtable 代码,您最终会返回一个 java.util.Hashtable.Enumerator 实现 Enumeration, Iterator 类型的实例

这就是为什么:)

【讨论】:

    【解决方案3】:

    hashTable.elements()返回一个java.util.Hashtable.Enumerator对象,这个类同时实现了java.util.Enumerationjava.util.Iterator

    【讨论】: