【问题标题】:Return type of iterator() method in javajava中iterator()方法的返回类型
【发布时间】:2014-05-27 03:25:56
【问题描述】:

我是 Java 新手,正在学习中。 我需要一个有有效理论支持的以下问题的答案。 考虑以下行-

Iterator itr = al.iterator(); 

其中 al 是一些 ArrayList(类)类型的集合对象。 我想知道这里的返回类型是什么

al.iterator()

它不一定是原始数据类型,那么它可能是一个对象,但是由于每个对象都属于一个类,那么它是哪个类。文档和书籍等说它具有迭代器的返回类型。但是 Iterator 是一个接口。另一方面,我们说接口不能有直接对象。虽然接口变量可以引用实现它的一个或多个类的对象。

-

所以上面的语法是正确的(因为迭代器变量 itr 可以用来引用某个实现它的类的对象)。但实际上它是哪个类的对象?并且可以用该类的引用变量替换 itr 不会导致错误(我已经尝试用上面行中的 ArrayList 类的引用变量替换 itr 但这会导致错误) .我也经常以泛型形式使用这种语法,但不知道这背后的理论。我假设我在这里缺乏一个非常基本的概念。请改正。

【问题讨论】:

  • Here's javadoc.
  • 概念是programming to an interface @SotiriosDelimanolis 我记得我们有相同的声誉xD
  • @nachokk 我有一个容易上瘾的性格。我在这里花了太多时间。

标签: java methods collections iterator return-type


【解决方案1】:

我想知道这里al.iterator()的返回类型是什么

你不应该关心。该方法返回的 Iterator 的特定实现并不重要,只要它返回一个 Iterator。您可以调用 next、hasNext 和 remove,或使用 for-each 循环进行迭代,而无需知道它恰好是 ArrayList.Itr 或任何实现。

假设在 ArrayList 上工作的 Java 开发人员想要将他们的迭代器实现重命名为 ArrayListIterator 而不是他们现在所调用的任何名称。如果您的代码依赖于知道确切的迭代器实现,那么您将不得不更改代码来处理您甚至不应该看到的 ArrayList 内部更改。

【讨论】:

  • 如果我有 shouldn't care ,我永远不会在这里问这个问题。或者你不应该在意给出这个答案。无论如何,这不是我的问题的答案。
  • @user3528086:你会发现不关心是一项非常重要的编程技能。如果您的代码过于关心其他代码的抽象障碍背后发生的事情,那么它将非常脆弱且无法维护。
  • 嗨@user2357112 不在乎绝对是一种美德;可以在许多情况下为您提供实际帮助。我有这个美德。但是当我问这个问题时,我辜负了这个美德。另一方面,关心也绝对是美德!
【解决方案2】:

你说得对,Iterator 是一个接口。所以,一些类必须实现这个接口,你才能使用它。

迭代器接口定义了迭代器应该做什么。在这种情况下,类 ArrayList 提供了它自己的这个接口的实现。

你从 al.iterator() 得到的是 ArrayList Itr 的内部类(见下面的代码,它是迭代器。(就像我们描述的 IS-A关系)

(你现在可以把内部类想象成一个普通的类。所以你的问题的答案是Itr,它只是一个名字,你应该关心的是它的功能,由接口Iterator定义。)

   /**
     * An optimized version of AbstractList.Itr
     */
    private class Itr implements Iterator<E> {
        int cursor;       // index of next element to return
        int lastRet = -1; // index of last element returned; -1 if no such
        int expectedModCount = modCount;

        public boolean hasNext() {
            return cursor != size;
        }
       .....
  }

此代码由编写 ArrayList 类的 Josh Bloch 和 Neal Gafter 编写。

【讨论】:

  • 嗨@Weishi Zeng,这与我的答案非常接近。 ArrayList的内部类Itr的对象,可以是iterator()方法的返回类型。但是我们可以使用 Itr 内部类的变量来代替 Iterator 接口变量(在上面问题的语法行中)(Itr 的启动变量class like- 'ArrayList.Itr itr = new ArrayList.Itr ();' 导致错误,因为 Itr 类是私有的)
【解决方案3】:

实现是在AbstractList 本身中定义的。在其source code 找到它。

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
    private class Itr implements Iterator<E> {
       ...
    }

    public Iterator<E> iterator() {
       return new Itr();
    }
}

试试

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

输出

java.util.AbstractList$Itr

【讨论】:

  • 源码好像表明ArrayList有自己的Itr内部类;它不使用 AbstractList 实现。
  • 再次查看iterator() 方法,它是AbstractList 类的一部分。
  • 我在ArrayList 中没有找到任何内部类Itr。你找到了吗?
  • 在eclipse中试试。从这里不清楚它说:An optimized version of AbstractList.Itr
【解决方案4】:

您可以预先定义迭代器的返回类型。当您声明迭代器时,您可以(并且应该)像这样定义列表项的类型:

Iterator&lt;File&gt; itr = al.iterator();

因此,当您访问 itr 时,您不必强制转换为文件,例如(File) itr.next() 但可以直接在你的while循环中使用:

while (it.hasNext()) { File f = itr.next() }

您的编译器现在在使用 next() 时不会报错。

【讨论】:

    【解决方案5】:

    Iterator 是通用的,除非您在 ArrayList 中定义它,否则它不会返回特定类型。 Iterator 是一个接口(Java 集合的一部分),它返回传递给它的类型。 Iterator 用于遍历元素列表,并在必要时删除元素。

    【讨论】:

      【解决方案6】:

      它只是返回它所迭代的对象。例如你可以参考下面的代码。

          while(itr.hasNext())
          {
              String str = itr.next().toString(); // Converting an answer type object into String.
              System.out.println(str);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-19
        • 2012-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多