我有两个类: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新手,非常感谢你。
答案 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);