即使超类实现相同的接口,在子类中实现接口也有任何好处

当我看到ArrayList的声明时

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

尽管ArrayList的超类AbstractList实现了相同的List接口,但它实现了List接口。

 abstract class AbstractList extends AbstractCollection implements List 

类似的声明也可以在HashMapLinkedHashMap声明中找到。

在此处输入图像描述

LinkedHashMap的声明中,它仅实现了Map接口,而不是其超类HashMap实现的其他接口。

因此,拥有此类声明可能会带来一些好处。

再次声明它们没有任何function上的好处,它不会以任何方式影响行为。

我想这只是为了更清楚地实现哪些接口而添加的。

这仅用于文档目的,以使类的用户能够立即清楚该类实现的接口。

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

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

并添加Joeri Hendrickx评论的内容 – 它是为了显示ArrayList实现List。 整个画面中的AbstractList只是为了方便起见,减少了List实现之间的代码重复。

参考: 为什么ArrayList有“实现List”?

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

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

好吧,这样你在创建AbstractList的子类时必须实现List方法,你也可以使用ArrayList作为AbstractList

ArrayListAbstractList实现List用于不同目的。

  • List 确定类成为列表所需的内容。
  • ArrayList实现List作为定义其自己的接口的一部分 。 这对于ArrayList来说至关重要。
  • ArrayList扩展AbstractList作为其自身实现的一部分。 这完全是可选的:可以从头开始实现ArrayList而不inheritanceAbstractList ,并且该类可以以相同的方式工作。
  • AbstractList旨在作为List其他实现的基类。 它不是建立接口,而是遵循现有接口。 不需要AbstractListList的实现,一切都会编译运行,没有它只是相同。 但是,inheritanceList可以让Java编译器发现接口方法和AbstractList方法之间存在潜在的差异,因此AbstractList实现List接口是一个非常好的主意。