7

Java集合接口中存在一些继承关系。例如,Collection<T>接口将扩展Iterable<T>. 我检查了JDK中的源代码,基类中定义的一些方法在子类中重复了几次。例如: Interable<T>接口定义了一个方法 Iterator<E> iterator();但是在接口Collection<E>List<T>中,也包含相同的方法。在我的理解中,既然继承是用来减少重复的,为什么要在子类中定义相同的方法呢?

4

4 回答 4

5

参见java.util.List

“List 接口对迭代器、add、remove、equals 和 hashCode 方法的合同进行了额外的规定,超出了 Collection 接口中指定的规定。为方便起见,此处还包括其他继承方法的声明。”

于 2012-07-16T13:41:56.127 回答
1

Collection在 1.2 版中出现,但Iterable后来在 1.5 版中出现以允许简洁的 for 循环,所以我认为这是Collection在版本之间保持接口和 Javadocs 相同的情况。但是你是对的,你没有理由不能iterator()从 中删除该方法Collection,一切仍然可以编译。

于 2012-07-16T13:42:26.890 回答
1

Collection接口扩展 Iterable。_ 抽象超类实现了几个类共有的方法,在列表的情况下,它是AbstractList,每个具体类(比如ArrayListLinkedList)都提供特定的实现细节。

事实上,正如您已经猜到的那样,继承用于减少代码重复。但正因为如此,所有的子类都将包含父类中定义的相同操作,几个类共有的实现细节在抽象类级别的类层次结构中只会出现一次,并且不会在抽象类中再次“定义”子类 - 只有发生变化的部分在具体子类中重新定义。

于 2012-07-16T13:43:23.443 回答
0

Iterable接口是稍后介绍的since 1.5。所以,在这个版本的早期,只有java.util.Collection子类用于实现iterator().

后来iterator()通过引入Iterable接口成为标准,任何可以迭代的类都可以实现这个接口。

在引入Iterable接口之后,Collection接口也做了扩展Iterable接口,使Collection接口也实现了标准接口。

例如,

  • java.sql.SQLException还实现了 Iterable
于 2012-07-16T13:40:00.200 回答