簡體   English   中英

我如何找到抽象方法hasNext()的實現?

[英]How do I find the implementation of the abstract method, hasNext()?

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

如下例所示,迭代器obj直接使用hasNext()而不執行它。 但是,我被告知您需要在接口中實現抽象方法。

我的問題:
(1)如何找到抽象方法hasNext()的實現? (2)評論說我可以在這里找到代碼。 在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());
    }

您可以在代碼中看到List是一個ArrayList。 ArrayList中稱為iterator()的方法將返回Iterator的實現。 Iterator的此實現將實現hasNext()方法。

很好奇,正如評論所述,您可以單擊IDE中的代碼(或者,如果這對您不起作用,請在調試器中設置一個斷點並介入)。 讀取Java代碼是消除神秘感的好方法。

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

此類的迭代器和listIterator方法返回的迭代器是快速失敗的:如果在創建迭代器后的任何時間以任何方式對列表進行結構修改,除非通過迭代器自己的remove或add方法,否則迭代器將拋出ConcurrentModificationException。 因此,面對並發修改,迭代器會快速干凈地失敗,而不會在未來的不確定時間內冒任意,不確定的行為的風險。

集合上的迭代器。 在Java Collections Framework中,迭代器代替了枚舉。 迭代器與枚舉有兩個方面的不同:迭代器允許調用者在迭代期間使用定義明確的語義從基礎集合中刪除元素。 方法名稱已得到改進。

https://docs.oracle.com/javase/8/docs/api/java/util/Iterator.html

next()hasNext()方法是Iterator接口的一部分。 每個特定的實現將提供自己的版本。 您可以在此處的commons-collection庫或 此處的 SingletonListIterator 查看如何為ArrayListIterator定義它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM