创建ListIterator时会发生什么?

时间:2011-08-26 19:58:23

标签: java list casting

我有两个类:ParentClass和SubClass。 SubClass继承自ParentClass。 我有以下代码:(在课堂内)

List<SubClass> lstSub;

//some initialization

public ListIterator getLstIterator(int i) {
   return lstSub.listIterator(i);
}

客户端类通过以下方式使用它:

ListIterator<ParentClass> lstParent = getLstIterator(0); //assign ListIterators

所以,问题是: 分配ListIterator时程序做了什么:

1)它创建一个新列表并从源列表中复制元素,将它们转换为ParentClass;

2)它只是创建了一个到lstSub的链接,从这个时候这个列表被解释为List for ListIterator?

或者它做了别的什么? 由于程序性能,我对它很感兴趣。我是Java新手,非常感谢你。

3 个答案:

答案 0 :(得分:1)

创建了ListIterator的新实例。对新对象的引用将复制到lstParent

请参阅here

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

免责声明:此示例特定于ArrayList。

答案 1 :(得分:1)

它不会创建另一个列表。如果你在不知道列表中的类的情况下得到列表迭代器,那将是你的泛型使用中的错误。你做这个任务时应该收到警告,但这只是一个警告。当你真正使用它时,它会被投射到任何类。如果你想要一个列表迭代器,你可以正确地保持ListIterator<? extends ParentClass>,但实际上持有一个迭代器有点奇怪。

最后,只是一些建议,我不会太担心语言功能的表现,特别是如果你刚刚开始使用这种语言。

答案 2 :(得分:1)

在性能方面,没有列表复制正在进行。

但是要让编译器检查代码的类型安全性,你应该声明类型参数如下:

public ListIterator<SubClass> getLstIterator(int i) {
  return lstSub.listIterator(i);
}

...

ListIterator<? extends ParentClass> lstParent = getLstIterator(0);