枚举接口有方法hashMoreElements与引用变量(Enumv)一起使用,如何使用它们 既然他们没有实施? 我的意思是它是一个接口方法,所以如何调用它 - Enumv.hasMoreElements()它没有实现。
Vector v = new Vector();
//v contains list of elements - Suppose
Enumeration Enumv = v.elements();
while(Enumv.hasMoreElements()) {
System.out.println(Enumv.nextElement());
}
这怎么可能?
答案 0 :(得分:3)
Enumeration
是一个界面。它提供了方法定义,但实现接口的任何内容都必须提供实现。关键是代码通过接口使用对象不需要知道实现 - 只是某些东西正在实现相关的方法。
对于Vector.elements()
返回的值,Enumeration
实现实际上是通过匿名内部类提供的 - 但调用者根本不需要关心它。
(请注意,这不是Enumeration
特有的 - 这是接口的一般原则。)
答案 1 :(得分:3)
对于您的代码,
Enumeration Enumv = v.elements();
这是Vector
返回给你的东西。
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");
}
};
}
如您所见,Vector返回一个已实现的Enumeration
类(对开发人员来说是匿名的)。
所以如何调用它 - Enumv.hasMoreElements()它没有 有一个实现。
实施(如上所示)。
答案 2 :(得分:1)
Vector.elements()
不会简单地返回“枚举”
在reallity中,它返回Enumeration
的实现的实例,但Enumeration
的实现“是”Enumeration
并且可以“转换”到Enumeration
接口。
因此该方法已实施,这就是它的工作原理。
在Vector
案例中,实现是一个直接基于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 elementData(count++);
}
}
throw new NoSuchElementException("Vector Enumeration");
}
};
}
资源:
答案 3 :(得分:0)
我完全不明白你的问题。
Vector类有一个elements()方法的实现,它返回一个Enumeration。返回的Enumeration的具体实现需要具有hasMoreElements()方法的实现。
答案 4 :(得分:0)
elements()
类的Vector
方法返回实现Enumeration
接口方法的匿名类的实例。你不需要知道关于这个类的任何信息,因为接口定义了它应该如何表现 - 这正是接口的重点。
请注意Vector
和Enumeration
都已过时,不应再使用了。相反,请使用ArrayList
和Iterator
。