我是java新手我试图看到集合界面的层次结构。我发现 AbstractList.java 的签名就像
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
它实现了List接口。但是,如果你看看子类ArrayList.java的签名,它看起来像
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
如果看起来父类已经实现List接口那么为什么子类再次实现相同的接口( List )。
此背后是否有具体原因或要求
答案 0 :(得分:8)
此背后是否有具体原因或要求
我不这么认为。就编译器而言,删除第二个List<E>
将完全没有改变。
我的两个假设是:
ArrayList<E>
is-a List<E>
(这可能是了解ArrayList
的最重要的事情)。 答案 1 :(得分:3)
我不知道答案是什么,所以我做了一些研究。事实证明,这是为了清晰。
是。它可能已被省略。但因此它立即可见 这是一个清单。否则额外点击代码/ 将需要文件。我认为这就是原因 - 清晰度。
并添加Joeri Hendrickx所评论的内容 - 这是为了达到目的 显示ArrayList实现List。 AbstractList在整体上 图片只是为了方便和减少代码之间的重复 列表实现。
答案 2 :(得分:0)
来自Java Ranch 的可能只是出于文档目的,为人们说清楚 谁想要使用ArrayList。
它确实是多余的,因为ArrayList的AbstractList超类 已经实现了List接口。
另一个原因可能是: 我发现它here。 // This class captures common code shared by both the ArrayList and LinkedList.
// An abstract class is a good way to provide a partially implemented class, or
// a partial implementation of an interface. Notice that the header of this
// class claims to implement the List interface, but the file doesn't write
// all of the methods.
//
// Java allows this file to compile because it knows that the abstract class
// must be extended to complete it. If a subclass of AbstractList doesn't
// implement all the rest of the List interface's methods, that subclass will
// not compile.