Java集合接口中存在一些继承关系。例如,Collection<T>
接口将扩展Iterable<T>
。
我检查了JDK中的源代码,基类中定义的一些方法在子类中多次重复。例如:
Interable<T>
接口定义了一个方法Iterator<E> iterator();
但是在接口Collection<E>
和List<T>
中,也包含相同的方法。根据我的理解,由于继承用于减少重复,为什么我们应该在子类中定义相同的方法?
答案 0 :(得分:5)
“List接口在迭代器,add,remove,equals和hashCode方法的合同上放置了除Collection接口中指定的规则之外的其他规定。为方便起见,此处还包括其他继承方法的声明。” / p>
答案 1 :(得分:1)
Collection
在版本1.2中出现,但是Iterable
在版本1.5中出现以允许简洁的for循环,所以我认为这是保持Collection
接口的情况发行版之间的Javadocs相同。但是你是对的,没有理由你不能从iterator()
删除Collection
方法,一切都会编译。
答案 2 :(得分:1)
Collection
界面扩展 Iterable
。抽象超类实现了几个类共有的方法,对于列表,它是AbstractList
,每个具体类(比如ArrayList
或LinkedList
)提供具体的实现细节。 / p>
事实上,正如您所猜测的那样,继承用于减少代码重复。但正因为如此,所有子类都将包含在超类中定义的相同操作,几个类共有的实现细节在抽象类级别的类层次结构中只出现一次,并且它们不会再次“定义”。子类 - 仅在具体子类中重新定义更改的部分。
答案 3 :(得分:0)
后来Iterable
引入了since 1.5
界面。因此,在此版本之前,只有java.util.Collection
个子类用于实现iterator()
。
后来iterator()
通过引入Iterable
接口而成为标准,这样任何可以迭代的类都可以实现此接口。
在引入Iterable
接口之后,还Collection
接口扩展Iterable
接口,使Collection
接口也实现了标准接口。
对于Ex,
java.sql.SQLException
也实现了Iterable