【问题标题】:How do I find the implementation of the abstract method, hasNext()?如何找到抽象方法 hasNext() 的实现?
【发布时间】:2016-07-10 04:09:54
【问题描述】:

我对以下与 Java OOP 和 Java API/源代码安排有关的情况感到困惑。基于Oracle's Java 8 API,hasNext() 是一个抽象方法,但是我找不到hasNext() 是在哪里实现的。我读到私有内部类用于在每个 Collection 类中实现不同的迭代器,但没有关于如何找到实现位置的更多信息。一些用户建议我将 Java JRE 1.8 源代码添加到我的 Eclipse IDE 中,但我只能看到 boolean hasNext(); 在 Iterator 接口中声明为抽象方法。

如下例所示,迭代器 obj 直接使用 hasNext() 没有实现它。但是,我被告知您需要在接口中实现抽象方法。

我的问题:
(1) 如何找到抽象方法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());
    }

【问题讨论】:

标签: java oop collections interface polymorphism


【解决方案1】:

我有同样的问题如果 ListIterator 是只包含抽象方法的接口,哪个类负责实现这些方法。

得出结论(如果我错了,请纠正我)

ArrayList 实例方法 ListIterator 正在返回 ListItr(0) 的实例 ListItr(java.util.ArrayList.ListItr) 是实现 ListIterator 接口和抽象方法的类。 从技术上讲,ListIterator 可以保存它的实现类的实例。

【讨论】:

    【解决方案2】:

    集合上的迭代器。迭代器在 Java 集合框架中取代了枚举。迭代器在两个方面不同于枚举: 迭代器允许调用者在具有明确定义的语义的迭代期间从底层集合中删除元素。 方法名称已得到改进。

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

    【讨论】:

      【解决方案3】:

      next()hasNext() 方法是 Iterator 接口的一部分。每个特定的实现都将提供自己的版本。您可以查看公共集合库 hereSingletonListIterator here 中的 ArrayListIterator 是如何定义它们的。

      【讨论】:

      • 基于“我知道私有内部类用于实现不同的迭代器”,看起来 OP 知道这一点。我怀疑真正的问题是“如何在 IDE 中轻松找到具体实现”。
      • 我明白你的意思,但老实说,我认为问题的一个可以说是错误的表述不应该导致对一个有点有效的答案投反对票:My Question: Where is the abstract method, hasNext(), implemented? How do I find it?
      • 同意,这就是我没有对你投反对票的原因(但不能阻止其他人这样做,也不能对你投赞成票,因为我不确定它是否正确回答了 OP 问题)。跨度>
      • 问题是“如何找到实现”,所以说“阅读interface的javadoc”的答案对问题,因为这只会给你规范,而不是实现。
      • @DavidFernandez ListIterator 不是一个具体的实现,因为它只是一个子接口。那里没有实现,这是我评论的重点:问题是关于实现的,你的帖子告诉你去看看接口。这不是问题的答案。
      【解决方案4】:

      您可以在您的代码中看到,List 是一个 ArrayList。 ArrayList 中名为 iterator() 的方法将返回 Iterator 的实现。 Iterator 的这个实现将实现 hasNext() 方法。

      很好奇,正如评论所说,您可以单击 IDE 中的代码(或者如果这不适合您,请在调试器中设置断点并单步执行)。阅读 Java 代码是解开它的神秘面纱的好方法。

      当然,您通常可以期望 Java 人员知道他们在做什么,并相信您返回的实现是明智的,并且适合一般用途。这里需要注意的是,您还应该阅读文档。例如。来自https://docs.oracle.com/javase/7/docs/api/java/util/ArrayList.html

      这个类的迭代器和listIterator返回的迭代器 方法是快速失败的:如果列表在任何结构上被修改 迭代器创建后的时间,除了通过 迭代器自己的删除或添加方法,迭代器会抛出一个 并发修改异常。因此,面对并发 修改,迭代器快速而干净地失败,而不是 在不确定的时间冒着任意的、不确定的行为的风险 未来。

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 2013-09-25
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 2021-06-02
        • 1970-01-01
        • 1970-01-01
        • 2016-11-08
        相关资源
        最近更新 更多