ArrayList.java中List接口的冗余实现

时间:2012-12-20 14:05:16

标签: java collections

  

可能重复:
  Why does ArrayList have “implements List”?

我是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 )。

此背后是否有具体原因或要求

3 个答案:

答案 0 :(得分:8)

  

此背后是否有具体原因或要求

我不这么认为。就编译器而言,删除第二个List<E>将完全没有改变。

我的两个假设是:

  1. 这是出于历史原因。但是,我找不到任何证据来支持这一点。
  2. 包含它是出于文档目的,使其立即明确而不是ArrayList<E> is-a List<E>(这可能是了解ArrayList的最重要的事情)。

答案 1 :(得分:3)

我不知道答案是什么,所以我做了一些研究。事实证明,这是为了清晰。

  

是。它可能已被省略。但因此它立即可见   这是一个清单。否则额外点击代码/   将需要文件。我认为这就是原因 - 清晰度。

     

并添加Joeri Hendrickx所评论的内容 - 这是为了达到目的   显示ArrayList实现List。 AbstractList在整体上   图片只是为了方便和减少代码之间的重复   列表实现。

Why does ArrayList have "implements List"?

答案 2 :(得分:0)

  

可能只是出于文档目的,为人们说清楚   谁想要使用ArrayList。

     

它确实是多余的,因为ArrayList的AbstractList超类   已经实现了List接口。

来自Java Ranch

另一个原因可能是:

// 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. 

我发现它here