6

List接口有两个方法listIterator()iterator(). 为什么这两个都需要。

文档:

Iterator<E> iterator()

Returns an iterator over the elements in this list in proper sequence.

ListIterator<E> listIterator()

Returns a list iterator over the elements in this list (in proper sequence).

    ListIterator<E> listIterator(int index)

    Returns a list iterator over the elements in this list (in proper sequence), starting at the 
specified position in the list. The specified index indicates the first element that would be 
returned by an initial call to next. An initial call to previous would return the element with the 
specified index minus one.

所以基本上,ListIterator()有这个额外的方法来获取previous and next元素,而Iterator()只有next元素。难道这只是为了这个目的,还有另一个ListIterator() interfacelistiterator() method in List inteface

4

4 回答 4

5

从 Java 5 开始,可以简单地使用更具体的返回类型(称为协变返回类型)覆盖方法。但ListIterator已在 Java 1.2 中引入。为了避免使用强制转换,iterator()必须有一种新方法。

从 Java 5 开始,该 API 无法更改,因为如果大多数实现实际返回一个实例,这将破坏所有List未声明iterator()返回的实现。ListIteratorListIterator

一个类似的困境是Enumerationand Iterator。如今Iterator将扩展Enumeration并简单地添加该remove()方法。或者更好的Iterator是会被替换Enumeration,并且会添加ModifiableIterator一个额外的remove()

于 2013-11-05T22:38:27.673 回答
3

具体来说,它们都是必需的,因为List它是一种Iterable指定Iterator iterator()方法的类型。

现在List可以简单地重写iterator()方法Iterable来声明一个返回类型ListIterator是类型的Iterator(从而满足合同)。为什么不这样做可能是一个设计决定。

编辑:@ajb 在评论中指出,协变返回类型是在List创建接口后在 Java SE 5 中添加的。这解释了为什么List这两种方法都有,因为在 Java 1.2 中iterator()无法将返回类型缩小到范围。ListIterator

于 2013-11-05T21:36:58.493 回答
1

Java 被设计得非常坚固——允许在不影响 Java 上运行的代码的情况下进行大量语言实现更改。

例如,您通常可以将“Java JRE 6”替换为“Java JRE 7”,并且大多数代码都不会出现问题——这是一个带有新语法的整个语言升级。您还可以将 Java JRE 替换为开源实现,您将获得相同的结果——这些东西几乎可以正常工作。

所以当他们设计一个类时,他们必须同时为实现者和编码者设计它。

如果他们只是让 ArrayList 成为“Iterable”,那么对于 ArrayLists 返回一个 ListIterator 类型的 Iterator,那么接口将不需要另一个实现者(OpenJDK)来返回正确的类型——不仅如此,用户也没有在不查看文档的情况下了解返回的类型(如果每个人都以这种方式编程,Eclipse ctrl-space 将不太有用)。

Java 通常试图在物理上尽可能明确......这是一件非常好的事情,因为它停止猜测和相关错误。

当无法使接口和类型足够明确时,他们会非常谨慎地编写文档,但如果可能的话,他们会避免这样做。

于 2013-11-05T21:56:46.610 回答
0

Iterator 似乎用于单链表,ListIterator 用于双链表。

于 2013-11-05T21:12:17.810 回答