Java集合接口中的继承问题

7
在Java集合接口中存在一些继承关系。例如,Collection<T>接口将扩展Iterable<T>。 我查看了JDK中的源代码,发现基类中定义的一些方法在子类中被重复多次定义。例如: Interable<T>接口定义了一个方法Iterator<E> iterator();但在接口Collection<E>List<T>中也包含相同的方法。据我理解,由于继承用于减少重复,为什么我们要在子类中定义相同的方法呢?
4个回答

5

请参见java.util.List

"List接口在Collection接口指定的规定之外,对迭代器、添加、删除、相等和哈希码方法的契约提出了额外的规定。方便起见,还在此处包括了其他继承方法的声明。"


1
实际上,我猜重新声明这些方法的原因是(正如您发布的引文所述):1.能够添加不同的JavaDoc注释(即提到的合同),以及2.作为一种便利,提供快速概述可用的方法。 - Thomas

1

Collection 在 1.2 版本中发布,但是 Iterable 在之后的 1.5 版本中发布,以便允许简洁的 for 循环,所以我认为这是为了保持接口和 Javadocs 在版本之间的一致性。但你说得对,没有理由不能从 Collection 中删除 iterator() 方法,所有内容仍然可以编译。


1

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

事实上,正如你所猜测的那样,继承被用于减少代码重复。但正因为如此,所有子类都包含在超类中定义的相同操作,几个类共有的实现细节只出现一次在抽象类层次结构中,并且它们不会在子类中再次“定义”——只有变化的部分在具体的子类中重新定义。


0

Iterable 接口是在 1.5 版本之后引入的。因此,在此版本之前,只有 java.util.Collection 的子类才能实现 iterator()

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

引入 Iterable 接口后,Collection 接口也被修改为扩展 Iterable 接口,以便 Collection 接口也实现了标准接口。

例如:

  • java.sql.SQLException 也实现了 Iterable 接口

1
由于他正在引用接口,因此不涉及覆盖。 - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接