当listIterator用作引用类型时,分配给它的对象必须实现它吗?

时间:2015-08-28 07:37:46

标签: java list iterator listiterator

对于类型为接口的引用变量,分配给它的对象必须实现接口。 这对于List Iterator接口是如何实现的,该接口被分配了一个没有实现它的类的对象。(我无法在层次结构中找到关系)

List<String> list = new ArrayList<String>();

ListIterator<Type> it = list.listIterator(list.size());---1

我读到Iterator是ListIterator的超类,但我找不到ListIterator和ArrayList或List之间的关系。

使用List接口,我知道它有一个方法listIterator(),它有助于为集合分配迭代器。但是哪个类实际上实现了ListIterator,以便在层次结构中为它分配它。

我试图理解陈述1以及如何分配这个值。

1 个答案:

答案 0 :(得分:0)

根据immibis评论的建议,让我们来看看listIterator(int)的实现:

public ListIterator<E> listIterator(int index) {
    if (index < 0 || index > size)
        throw new IndexOutOfBoundsException("Index: "+index);
    return new ListItr(index);
}

我们看到,返回类型是ListIterator<E>,这正是我们所期望的(因为ArrayList类定义是public class ArrayList<E>)。例如,如果我们有ArrayList<String>,方法返回类型将为ListIterator<String>

但这是什么?它不是我们创建的ListIterator,而是ListItr的实例。让我们来看看它的定义:

private class ListItr extends Itr implements ListIterator<E>

它是ArrayList的内部类,它定义了一些实现ListIterator接口的类。

所以,看看你的代码,我们可以添加一些括号,以便更清楚地发生了什么:

ListIterator<Type> it = (list.listIterator(list.size()));

我们做的是获取列表,然后在该列表上调用listIterator(),将list.size()作为参数传递。然后该方法返回一个ListIterator,它被分配给it

修改

我不确定我是否理解你的问题。在这种情况下,不是必须实现ListIterator接口的ArrayList,而是由您在ArrayList的实例上调用listIterator(int)方法返回的对象,因此它只是由必须实现接口的方法调用返回的对象。