Iterator、ListIterartor 和 Enumeration 的实例

Instances of Iterator, ListIterartor and Enumeration

有一段代码。

Vector v = new Vector<>();
Iterator it = v.iterator();
ListIterator lit = v.listIterator();
Enumeration enu=v.elements();
System.out.println(it.getClass().getName());
System.out.println(lit.getClass().getName());
System.out.println(enu.getClass().getName());

这里IteratorListIteratorEnumeration是接口类型 并且有变量保存它们的引用(分别为 itlitenu)。

当我编译这段代码时,我得到了 Vector 的匿名 class,即

java.util.Vector$Itr
java.util.Vector$ListItr
java.util.Vector

我想知道这是怎么发生的。

在前两种情况(java.util.Vector$Itrjava.util.Vector$ListItr)中,您没有获得 Vector 的匿名 classes。 java.util.Vector$something 表示 something 是 class 嵌套在 java.util.Vector class 中。匿名 classes 没有名字。 ItrListItr 是 class 个名字,所以他们绝对不是匿名的。

您确实获得匿名 class 实例的唯一情况是在 v.elements() 中,因为 Vectorelements() 方法 returns 是匿名的class 实现 Enumeration 接口的实例:

public Enumeration<E> elements() {
  return new Enumeration<E>() {
    int count = 0;

    public boolean hasMoreElements() {
      return count < elementCount;
    }

    public E nextElement() {
      synchronized (Vector.this) {
        if (count < elementCount) {
          return (E)elementData[count++];
        }
    }
      throw new NoSuchElementException("Vector Enumeration");
    }
  };
}

getClass() return是对象的实际运行时类型,而不是访问对象所使用的变量的声明类型。这意味着您 永远不会 看到 interface 类型 return 由 getClass() 编辑。

由于未指定 Vector.iterator()Vector.listIterator() 的实际类型 return,结果将是任意的。在您尝试过的实施中,您收到了 类,这似乎是 Vector 的内部 类,这是合理的,但是,如果您收到 类 内的顶级 类 16=] 甚至是完全不同的包的 类,这没有任何问题,只要这些 类 实现 Iterator 的合同即可。 ListIterator 界面正确。

这只是具体实现。