在Java中声明迭代器

7

我对Java中的迭代器感到非常困惑。

我正在阅读的教程说:

在Java编程语言中,接口是引用类型,类似于类,只能包含常量、方法签名和嵌套类型。没有方法体。接口不能被实例化——它们只能被类实现或由其他接口扩展。扩展将在本课程的后面讨论。

然后我看到另一个教程写着:

Iterator<String> flavoursIter = aFlavours.iterator();

我知道aFlavours继承了返回迭代器接口的迭代器函数。但我不理解这行代码实际上在做什么。 我认为你不能实例化吗?
也许我说得不清楚,请告诉我我哪里错了。

2
它只返回该接口的具体实现。另请参阅http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html - BalusC
5个回答

9

当它们说它不能被实例化时,意思是你不能这样做:Iterator i = new Iterator();。因为Iterator是一个接口,它本身没有实现。当你这样做时

Iterator flavoursIter = aFlavours.iterator();

你正在调用 aFlavours 对象上的 "iterator" 方法,该方法返回实现了 Iterator 接口的某个类的实例(你并不知道确切的类是什么,也不需要关心,你保证它支持 Iterator 接口中定义的所有方法)。


2
作为对其他答案的补充: 许多类将诸如Iterator之类的接口实现为私有内部类,然后在请求实例时返回该隐藏类的实例。如果您想要一个示例,可以阅读Collections框架的源代码。 这种方式的主要优点是隐藏了实现细节。例如,List的用户在调用someList.iterator()时不必知道返回的具体类是什么,也不需要知道Collections框架中有多少个不同的Iteraor实现。这使得该框架的开发人员可以根据需要(并发性,效率等)创建尽可能多的实现,而您作为该框架的用户则不必学习无数的类。

1

你说得对。 Iterator 是一个 interface,因此不能直接实例化。但是,你可以创建并实例化 Iterator 类的实现。

本质上,具有 iterator() 方法的类编写了它们自己的 Iterator 接口实现。 iterator() 实例化并返回 Iterator 的实现。


0
你不能创建一个 Iterator 对象,但你可以创建一个实现了 Iterator 接口的对象。使用 Iterator flavoursIter 意味着你不关心具体实现。

0

你好,

当我们调用iterator()方法时,它会返回一个Iterator实例,例如:

public Iterator iterator() {
    return new ArryListIterator implments Iterator {
         public T next() { // code for next() }
         public boolean hasNext() {//code for hashNext()}
         //others codes

      }

}

所以,你是否知道我们调用它时发生了什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接