2015-11-07 56 views
0

關於Java中迭代的問題。我(有點)熟悉接口Iterator,ListIterator和Iterable,也就是說我明白他們的想法。但這也是我的問題所在。如果我有一個ArrayList的實例,那麼我們只需調用這個實例的'list',如果我接着調用方法'list.listIterator()',那麼哪一個CLASS執行結果(即返回的)對象屬於?Java:List.listIterator()返回的對象屬於哪個CLASS?

我明白它必須是一個實現接口ListIterator的類,但是它仍然不會告訴我它屬於哪個實際的特定CLASS。而在線文檔似乎也沒有告訴我這一點。或者它只是一個'內部' - 因此是匿名/未命名 - Java類?

謝謝! 荷蘭。

回答

1

您可以通過執行

System.out.println(new ArrayList<String>().listIterator().getClass()); 

你會看到類被聲明爲內部ArrayList,被稱爲ListItr找出來。

它是private。這樣做有很好的理由。首先,它使ArrayList的作者能夠在不破壞任何人的代碼的情況下改變實現。而且,你不需要關心實際的課程是什麼;所有重要的是它服從ListIterator的合同。

+0

那麼,我會認爲這回答了這個問題(並且還教會了/提醒我一些事情,即使用getClass)。非常感謝! – Holland

+0

將盡快接受答案(有一個等待時間)。 – Holland

+0

沒問題。很高興我能幫上忙。 –

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(); 
     } 
    } 
} 
+0

謝謝,這也是很好的知道。 – Holland