Java:list.listIterator()返回的对象属于哪个CLASS?

时间:2015-11-07 16:30:25

标签: java list class iteration iterable

关于Java迭代的问题。我(有点)熟悉接口Iterator,ListIterator和Iterable,即我理解它们背后的想法。但这也是我的问题所在。

如果我有一个ArrayList实例,那么我们只需要调用这个实例'list',如果我然后调用'list.listIterator()',那么哪个CLASS会生成(即返回)对象?

我知道它必须是一个实现接口ListIterator的类,但是它仍然没有告诉我它属于哪个实际的特定CLASS。而在线文档似乎也没有告诉我这一点。或者它只是一个“内部” - 因此匿名/未命名 - Java类?

谢谢! 荷兰。

2 个答案:

答案 0 :(得分:1)

你可以通过

找到答案
System.out.println(new ArrayList<String>().listIterator().getClass());

您会看到该类在ArrayList内声明,并被称为ListItr

private。这样做是有充分理由的。首先,它使ArrayList的编写者能够在不破坏任何人的代码的情况下更改实现。而且,你不需要关心实际的课程;重要的是它遵守ListIterator的合同。

答案 1 :(得分:1)

在线文档告诉您可以从API中获得什么以及您可以做什么,您可以查看源代码以找到所需的详细信息,所以在这里:

来自Java源代码:

public ListIterator<E> listIterator(int index) {
    if (index < 0 || index > size)
        throw new IndexOutOfBoundsException("Index: "+index);
    return new ListItr(index);
}

上面说明你将获得ListItr的实现,以下是类的实际实现:

 private class ListItr extends Itr implements ListIterator<E> {
    ListItr(int index) {
        super();
        cursor = index;
    }

    public boolean hasPrevious() {
        return cursor != 0;
    }

    public int nextIndex() {
        return cursor;
    }

    public int previousIndex() {
        return cursor - 1;
    }

    @SuppressWarnings("unchecked")
    public E previous() {
        checkForComodification();
        int i = cursor - 1;
        if (i < 0)
            throw new NoSuchElementException();
        Object[] elementData = ArrayList.this.elementData;
        if (i >= elementData.length)
            throw new ConcurrentModificationException();
        cursor = i;
        return (E) elementData[lastRet = i];
    }

    public void set(E e) {
        if (lastRet < 0)
            throw new IllegalStateException();
        checkForComodification();

        try {
            ArrayList.this.set(lastRet, e);
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }

    public void add(E e) {
        checkForComodification();

        try {
            int i = cursor;
            ArrayList.this.add(i, e);
            cursor = i + 1;
            lastRet = -1;
            expectedModCount = modCount;
        } catch (IndexOutOfBoundsException ex) {
            throw new ConcurrentModificationException();
        }
    }
}