JVM 将枚举视为迭代器

Enumeration is considered as Iterator by JVM

我想知道为什么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?

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

由于返回的 Enumarator 实现了类型 Iterator,因此条件变为 true

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

这里是HashTable's Enumerator<T>定义的源代码。

迭代器和枚举是接口。它们是声明的,不能被实例化。所以无论 elements() returns 它将是一个实现 Enumeration 接口的实例。

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

这就是为什么:)

hashTable.elements() return 一个 java.util.Hashtable.Enumerator 对象,而这个 class 实现了 java.util.Enumerationjava.util.Iterator