繁体   English   中英

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

[英]Return type of iterator() method in java

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

Iterator itr = al.iterator(); 

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

al.iterator()

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

-

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

我想知道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<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编写。

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

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

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

Iterator<File> 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);
    }

假设任何接口(纯抽象类)或任何......如接口Iterator或class Iterator,这个Iterator返回什么? 接口或 class 对吗?...假设 iterator() 是 Iterator(接口或简单类)的方法,它准确返回名为 Iterator 的类型 而Iterator的返回类型是class或者interface,现在别问了。 class 或接口的返回类型是什么...我真的需要重新验证我的存在!

*类型:任何东西(类类型,接口类型或任何东西!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM