近来来遇到一个有趣的问题,
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这个子迭代器!