AbstractList未实现Iterator接口为何能返回Iterator实例?
解答你的疑问
首先得澄清一个关键误解:方法返回某个接口类型的对象,完全不需要当前类去实现这个接口——只需要返回一个已经实现了该接口的类的实例就行。
具体到AbstractList的情况:
- AbstractList的
iterator()方法内部,其实是返回了它的一个内部类Itr的实例,这个Itr类是明确实现了Iterator接口的(你可以查看JDK源码,AbstractList里有个private class Itr implements Iterator<E>的实现)。 - 你看到AbstractList本身没写
implements Iterator,但这不影响它返回Iterator类型的对象,因为真正实现Iterator接口的是它内部的Itr类,iterator()方法只是把这个内部类的实例返回出去而已。
举个简单的类比例子帮你理解:假设我们有个接口Animal,然后有个类Dog implements Animal,另一个类Person不需要实现Animal,但它可以有个方法getPet()返回Animal类型——只要在方法里new一个Dog返回就行:
public interface Animal {} public class Dog implements Animal {} public class Person { public Animal getPet() { return new Dog(); // Dog实现了Animal,所以可以合法返回 } }
AbstractList的iterator()方法就是这个逻辑,它本身不用实现Iterator,只要返回一个实现了Iterator的对象就行,而它内部的Itr正好承担了这个实现的角色。
另外你提到Iterator不是函数式接口,这点没错,所以没法直接用Lambda实现,但AbstractList用的是内部类实现的方式,这是Java里完全合法的接口实现手段——内部类可以独立实现接口,外部类只需要返回该内部类的实例即可,完全符合语法要求。
内容的提问来源于stack exchange,提问作者Anand Pandey
相关产品推荐
相关产品推荐

