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());
这里Iterator
、ListIterator
和Enumeration
是接口类型
并且有变量保存它们的引用(分别为 it
、lit
和 enu
)。
当我编译这段代码时,我得到了 Vector
的匿名 class,即
java.util.Vector$Itr
java.util.Vector$ListItr
java.util.Vector
我想知道这是怎么发生的。
在前两种情况(java.util.Vector$Itr
和 java.util.Vector$ListItr
)中,您没有获得 Vector
的匿名 classes。 java.util.Vector$something
表示 something
是 class 嵌套在 java.util.Vector
class 中。匿名 classes 没有名字。 Itr
和
ListItr
是 class 个名字,所以他们绝对不是匿名的。
您确实获得匿名 class 实例的唯一情况是在 v.elements()
中,因为 Vector
的 elements()
方法 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
界面正确。
这只是具体实现。
有一段代码。
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());
这里Iterator
、ListIterator
和Enumeration
是接口类型
并且有变量保存它们的引用(分别为 it
、lit
和 enu
)。
当我编译这段代码时,我得到了 Vector
的匿名 class,即
java.util.Vector$Itr
java.util.Vector$ListItr
java.util.Vector
我想知道这是怎么发生的。
在前两种情况(java.util.Vector$Itr
和 java.util.Vector$ListItr
)中,您没有获得 Vector
的匿名 classes。 java.util.Vector$something
表示 something
是 class 嵌套在 java.util.Vector
class 中。匿名 classes 没有名字。 Itr
和
ListItr
是 class 个名字,所以他们绝对不是匿名的。
您确实获得匿名 class 实例的唯一情况是在 v.elements()
中,因为 Vector
的 elements()
方法 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
界面正确。
这只是具体实现。