枚举方法

时间:2010-09-22 14:00:05

标签: java

枚举接口有方法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());
}

这怎么可能?

5 个答案:

答案 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接口方法的匿名类的实例。你不需要知道关于这个类的任何信息,因为接口定义了它应该如何表现 - 这正是接口的重点。

请注意VectorEnumeration都已过时,不应再使用了。相反,请使用ArrayListIterator