在Java的列表界面中需要使用listIterator()和iterator()是什么?

bra*_*orm 5 java iterator list

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.
Run Code Online (Sandbox Code Playgroud)

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

Arn*_*ter 5

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

API 不能从 Java 5 开始更改,因为如果大多数实现实际上返回一个实例,这将破坏所有List不声明iterator()返回的ListIterator实现ListIterator

一个类似的困境是EnumerationIterator。如今Iterator将扩展Enumeration并简单地添加该remove()方法。或者更好的Iterator是替换Enumeration并添加ModifiableIterator一个附加的remove()


Dev*_*Dev 3

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

现在List可以简单地重写iterator()in 中的方法Iterable来声明其返回类型,ListIterator其类型为 of Iterator(从而满足契约)。为什么没有这样做可能是一个设计决定。

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

  • 我认为协变返回类型是在 1.5 中添加的。`ListIterator` 自 1.2 起就已存在。 (7认同)
  • 可能是因为这样客户端必须将结果向下转换为“(ListIterator)”才能使用附加的“ListIterator”功能。 (2认同)
  • @ajb我不知道协变回报是一个附加功能。感谢您指出这一点,因为现在它非常有意义。 (2认同)