2016-03-23 23 views
2

我對以下與Java OOP和Java API /源代碼安排有關的情況感到困惑。基於Oracle's Java 8 API,hasNext()是一種抽象方法,但我找不到hasNext()的實現。我讀過私人內部類用於在每個Collection類中實現不同的迭代器,但沒有關於如何找到實現位置的更多信息。有些用戶建議我將Java JRE 1.8源代碼添加到Eclipse IDE中,但我只能在Iterator接口中將boolean hasNext();聲明爲抽象方法。如何找到抽象方法hasNext()的實現?

如下所示,迭代器obj直接使用hasNext()而不是實現它。但是,我被教導你需要在界面中實現抽象方法。 (1)如何找到抽象方法hasNext()的實現?如何找到抽象方法hasNext()的實現? (2)評論說我可以找到代碼here。在ArrayList類中實現hasNext()是什麼原因,但將hasNext()標記爲抽象方法?以這種方式找到hasNext()實現並不直觀。

List<String> list = new ArrayList<String>(); 
    list.add("item-1"); 
    list.add("item-2"); 
    list.add("item-3"); 

    Iterator<String> it = list.iterator(); 
    while (it.hasNext()) { 
     System.out.println(it.next()); 
    } 
+1

你在用什麼IDE?在IntelliJ IDEA中,您可以選擇一種方法,按住CTRL並單擊鼠標左鍵,直接進入寫入方法的代碼點。 –

+3

就在這裏。 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/ArrayList.java#748 –

+0

這聽起來像你試圖問「Where is * ArrayList的*'Iterator.hasNext()'被實現,如果是這種情況(你正在尋找一個特定的實現),那麼在這個問題中這麼說很有幫助。 – dimo414

回答

-2

next()hasNext()方法是Iterator接口的一部分。每個具體的實施將提供他們自己的版本。你可以看看它們是如何定義在公用集合庫hereSingletonListIteratorhere中的ArrayListIterator

+2

基於「我知道私有內部類用於實現不同的迭代器」,它看起來像OP知道的。我懷疑真正的問題是「*如何輕鬆找到IDE *中的特定實現」。 – Pshemo

+0

我明白了你的觀點,但我誠實地認爲,這個問題的一個可以說是錯誤的表述不應該導致對某種有效答案的低估:'我的問題:抽象方法hasNext()在哪裏實現?我如何找到它?' –

+0

同意,這就是爲什麼我沒有downvote你(但不能阻止別人這樣做,不能upvote你,因爲我不知道它是否正確地回答OP問題)。 – Pshemo

1

你可以在你的代碼中看到List是一個ArrayList。 ArrayList中的方法調用迭代器()將返回Iterator的實現。 Iterator的這種實現將實現方法hasNext()

很好奇,並且正如評論所說,您可以在IDE中單擊代碼(或者如果這不適合您,請在調試器中設置一個斷點並介入)。讀取Java代碼是一種很好的方式來去除它。

當然,您通常可以期望Java人知道他們在做什麼,並且相信您找回來的實現是明智的,並且適合一般用途。這裏的警告是你還應該閱讀文檔。例如。從https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

的迭代器此類的迭代器返回和的ListIterator 方法是快速失敗的:如果列表在任何 時間從結構上修改創建迭代器之後,以任何方式除了通過 迭代器自身的remove或者添加方法,迭代器將拋出一個 ConcurrentModificationException異常。因此,面對併發的修改,迭代器很快並且乾淨地失敗,而不是冒着在將來確定的時間 處的任意的,不確定的行爲冒險。