即使超类实现相同的接口,在子类中实现接口也有任何好处
当我看到ArrayList
的声明时
class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable
尽管ArrayList
的超类AbstractList
实现了相同的List
接口,但它实现了List
接口。
abstract class AbstractList extends AbstractCollection implements List
类似的声明也可以在HashMap
, LinkedHashMap
声明中找到。
在LinkedHashMap
的声明中,它仅实现了Map
接口,而不是其超类HashMap
实现的其他接口。
因此,拥有此类声明可能会带来一些好处。
再次声明它们没有任何function上的好处,它不会以任何方式影响行为。
我想这只是为了更清楚地实现哪些接口而添加的。
这仅用于文档目的,以使类的用户能够立即清楚该类实现的接口。
冗余implements
子句对编译器没有任何影响。
是。 它可能已被省略。 但是因此可以立即看到它是一个List。 否则,需要额外点击代码/文档。 我认为这就是原因 – 清晰度。
并添加Joeri Hendrickx评论的内容 – 它是为了显示ArrayList实现List。 整个画面中的AbstractList只是为了方便起见,减少了List实现之间的代码重复。
参考: 为什么ArrayList有“实现List”?
完全没必要。 我根本不会这样做。
目前还不清楚他们为什么那么做。 但到目前为止显然这是一个错误,因为当他们第一次注意到这种奇怪的冗余时,每个人都对此感到惊讶。
好吧,这样你在创建AbstractList
的子类时必须实现List
方法,你也可以使用ArrayList
作为AbstractList
。
ArrayList
和AbstractList
实现List
用于不同目的。
-
List
确定类成为列表所需的内容。 -
ArrayList
实现List
作为定义其自己的接口的一部分 。 这对于ArrayList
来说至关重要。 -
ArrayList
扩展AbstractList
作为其自身实现的一部分。 这完全是可选的:可以从头开始实现ArrayList
而不inheritanceAbstractList
,并且该类可以以相同的方式工作。 -
AbstractList
旨在作为List
其他实现的基类。 它不是建立接口,而是遵循现有接口。 不需要AbstractList
的List
的实现,一切都会编译运行,没有它只是相同。 但是,inheritanceList
可以让Java编译器发现接口方法和AbstractList
方法之间存在潜在的差异,因此AbstractList
实现List
接口是一个非常好的主意。