返回java中iterator()方法的类型

时间:2014-04-13 02:51:50

标签: java methods collections iterator return-type

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

Iterator itr = al.iterator(); 

其中 al 是ArrayList(class)类型的一些集合对象。

我想知道这里的返回类型是什么

al.iterator()

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

-

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

6 个答案:

答案 0 :(得分:4)

  

我想知道al.iterator()

的返回类型是什么

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

假设处理ArrayList的Java开发人员想要将他们的迭代器实现重命名为ArrayListIterator而不是他们现在调用的任何东西。如果您的代码依赖于了解Iterator的确切实现,那么您必须更改代码以处理您甚至不应该看到的ArrayList内部更改。

答案 1 :(得分:2)

你是对的,Iterator是一个界面。因此,某些类必须实现此接口,以便您可以使用它。

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

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

(你现在可以将内部课程视为普通课程。所以你的问题的答案是 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编写。

答案 2 :(得分:1)

实施在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

答案 3 :(得分:1)

您可以预先定义迭代器的返回类型。在声明迭代器时,您可以(并且应该)定义列表项的类型,如下所示:

Iterator<File> itr = al.iterator();

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

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

使用next()时,您的编译器现在不会抱怨。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

只需返回它迭代的对象。例如,您可以参考下面的代码。

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