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

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

Iterator itr = al.iterator(); 

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

al.iterator()

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

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

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

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

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

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

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

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

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

  /** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator { 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编写。

该实现在AbstractList本身中定义。 在源代码中找到它。

 public abstract class AbstractList extends AbstractCollection implements List { private class Itr implements Iterator { ... } public Iterator iterator() { return new Itr(); } } 

尝试

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

产量

 java.util.AbstractList$Itr 

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

Iterator itr = al.iterator();

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

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

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

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

简单地说它返回它迭代的对象。 例如,您可以参考下面的代码。

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