疑问:ListIterator与Iterator

近来来遇到一个有趣的问题,

Collection集合里有一个已知实现类 ArrayList,

可以使用Collection中的迭代器方法,Iterator,然后Iterator有局限性, 我使用了Iterator的子接口ListIterator,

为什么Arraylist 可以使用Iterator的子接口中的方法 Aaarylist只是实现了Collection接口啊  并没有说实现了ListIterator接口呀?

这个问题很简单,先看简单的例子

道理都知道,就像是B继承A类,那么在使用父类A对象的地方,能当做子类处理吗?答案是否定的

B b=(B) new A();

父类是不能向下转型的,子类可以向上转型

回到之前的问题,大致意思是:

Collection接口是实现了IteratorAble接口,而IteratorAble接口中有Iterator类型的成员变量 iterator

而ArrayList实现List接口,而List接口实现了Collection接口,换句话说ArrayList的对象可以使用iterator

再看Iterator,ListIterator是Iterator的子接口,那么只是实现了父接口,怎么能使用子接口ListIterator呢?

明显有矛盾啊!看了这么写文字估计有点绕,还是看源码吧!

ArrayList自下而上的继承实现关系:


接着看Iterator的继承关系:

再看ArrayList怎么使用Iterator和ListIterator

    ArrayList list=new ArrayList();
        Iterator iterator=list.iterator();
        ListIterator iterator1=list.listIterator();

重点看看.listIterator();

结论:

看到这儿估计都明白了,并不是实现父接口Iterator的ArrayList可以直接使用子接口ListIterator的方法

而是ArrayList有一个内部类实现了ListIterator接口,使用此内部类是实例化一个ListIterator接口类型的对象,

也就是listIterator这个子迭代器!

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/81627041