2013-04-05 90 views
8

当我看到的ArrayList是否有即使父类实现相同的接口实现子类中的接口任何好处

class ArrayList<E> extends AbstractList<E> 
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable 

它实现List接口声明即使ArrayList的超AbstractList实现同样的List接口。

abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> 

类似的声明可以在HashMapLinkedHashMap声明也被发现。

enter image description here

LinkedHashMap声明,它实现Map接口,而不是由它的超HashMap实现的其他接口。

所以有这样的声明可能有一些好处。

回答

6

再次声明它们没有功能优势,它不会以任何方式影响行为。

我想这只是为了使它更清楚地说明哪些接口已经实现。

+0

如果做更清楚的是唯一的好处,那么LinkedHashMap中甚至可能实现Cloneable,Serializable接口接口。但它没有。 – 2013-04-05 12:34:46

+2

@CharlesGreenWay我通常会写'地图<..>地图=新的LinkedHashMap <>()',但很少'Cloneable的复制,则=新的LinkedHashMap <>()'...一个'LinkedHashMap'主要是'Map',虽然它实现其他接口也是如此。 – 2013-04-05 12:37:19

+0

感谢@Heuster解释。这也是为了兼容性(即)如果将来,HashMap没有实现Map(尽管这可能不会发生),那么LinkedHashMap仍然可以实现Map – 2013-04-05 12:48:29

3

这样做只是为了文档的目的,使其立即清楚地知道该类实现的接口类的用户。

冗余implements子句对编译器没有影响。

0

那么,当你创建一个子类到AbstractList,你也可以使用ArrayList作为AbstractList,这样你必须实现List<E>方法。

+1

问题是为什么'ArrayList'明确实现'List',即使它隐式地这已经通过扩展'AbstractList'。正如Keppil和NPE指出的那样,这只是为了清楚起见。 – 2013-04-05 12:33:41

+0

@Heuster你是对的;它在这里没有实际效果。 – Pietu1998 2013-04-05 12:36:32

1

是的。它可能已被省略。但是因此可以立即看到它是一个List。否则,需要额外点击代码/文档。我认为这是原因 - 清晰度。

并添加什么Joeri Hendrickx评论 - 这是为了显示ArrayList实现List。整个图片中的AbstractList仅仅是为了方便,并且减少了List实现之间的代码重复。

参考:Why does ArrayList have "implements List"?

1

完全没有必要。我根本不会这样做。

目前还不清楚他们为什么那么做。但是现在显然这是一个错误,因为当他们第一次注意到这个奇怪的冗余时,每个人都感到惊讶。

0

ArrayList<T>AbstractList<T>实现List<T>出于不同的目的。

  • List<T>建立一类是list什么是必需的。
  • ArrayList<T>工具List<T>作为定义了自己的接口的一部分。这对ArrayList<T>是至关重要的。
  • ArrayList<T>延伸AbstractList<T>作为其自己的一部分实施。这完全是可选的:可以从头开始实现ArrayList<T>而不继承AbstractList<T>,并且类将以相同的方式工作。
  • AbstractList<T>旨在作为用于List<T>其它实施方式中的基类。而不是建立一个接口,它如下现有的一个。不需要AbstractList<T>List<T>的实现,所有的东西都可以在没有它的情况下编译和运行。然而,继承List<T>让接口方法和AbstractList<T>方法之间的Java编译器发现潜在的差异,所以它是AbstractList<T>实现List<T>接口一个非常好的主意。