Java集合接口中存在一些继承关系。例如,Collection<T>
接口将扩展Iterable<T>
. 我检查了JDK中的源代码,基类中定义的一些方法在子类中重复了几次。例如:
Interable<T>
接口定义了一个方法 Iterator<E> iterator();
但是在接口Collection<E>
和List<T>
中,也包含相同的方法。在我的理解中,既然继承是用来减少重复的,为什么要在子类中定义相同的方法呢?
4 回答
“List 接口对迭代器、add、remove、equals 和 hashCode 方法的合同进行了额外的规定,超出了 Collection 接口中指定的规定。为方便起见,此处还包括其他继承方法的声明。”
Collection
在 1.2 版中出现,但Iterable
后来在 1.5 版中出现以允许简洁的 for 循环,所以我认为这是Collection
在版本之间保持接口和 Javadocs 相同的情况。但是你是对的,你没有理由不能iterator()
从 中删除该方法Collection
,一切仍然可以编译。
Collection
接口扩展 Iterable
。_ 抽象超类实现了几个类共有的方法,在列表的情况下,它是AbstractList
,每个具体类(比如ArrayList
或LinkedList
)都提供特定的实现细节。
事实上,正如您已经猜到的那样,继承用于减少代码重复。但正因为如此,所有的子类都将包含父类中定义的相同操作,几个类共有的实现细节在抽象类级别的类层次结构中只会出现一次,并且不会在抽象类中再次“定义”子类 - 只有发生变化的部分在具体子类中重新定义。
该Iterable
接口是稍后介绍的since 1.5
。所以,在这个版本的早期,只有java.util.Collection
子类用于实现iterator()
.
后来iterator()
通过引入Iterable
接口成为标准,任何可以迭代的类都可以实现这个接口。
在引入Iterable
接口之后,Collection
接口也做了扩展Iterable
接口,使Collection
接口也实现了标准接口。
例如,
java.sql.SQLException
还实现了 Iterable