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>

类似的声明也可以在HashMap,LinkedHashMap声明中找到。

在此处输入图像描述

在 的声明中LinkedHashMap,它只实现Map接口,而不实现其超类实现的其他接口HashMap

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

4

6 回答 6

6

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

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

于 2013-04-05T12:30:11.797 回答
3

这样做仅用于文档目的,以使类的用户立即清楚该类实现了哪些接口。

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

于 2013-04-05T12:30:25.980 回答
1

是的。它可以被省略。但因此可以立即看出它是一个列表。否则需要额外点击代码/文档。我认为这就是原因——清晰。

并添加 Joeri Hendrickx 的评论 - 目的是展示 ArrayList 实现了 List。整个图中的 AbstractList 只是为了方便和减少 List 实现之间的代码重复。

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

于 2013-04-05T12:38:52.783 回答
1

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

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

于 2013-04-05T17:09:31.563 回答
0

好吧,这样你List<E>在创建 的子类时必须实现方法AbstractList,并且你也可以将 anArrayList用作AbstractList.

于 2013-04-05T12:31:21.357 回答
0

ArrayList<T>并为不同的目的AbstractList<T>实施List<T>

  • List<T> 确定类成为列表所需的内容。
  • ArrayList<T>实现List<T>作为定义自己的接口的一部分。这对于什么ArrayList<T>是必不可少的。
  • ArrayList<T>AbstractList<T>作为其自身实现的一部分进行扩展。这完全是可选的:ArrayList<T>无需继承就可以从头开始实现AbstractList<T>,并且该类将以相同的方式工作。
  • AbstractList<T>旨在作为其他实现的基类List<T>。它不是建立一个接口,而是遵循一个现有的接口。AbstractList<T>的实现List<T>不是必需的,没有它,一切都可以编译和运行。但是,继承List<T>可以让 Java 编译器发现接口方法和 的方法之间的潜在差异AbstractList<T>,因此AbstractList<T>实现List<T>接口是一个非常好的主意。
于 2018-02-15T13:21:10.837 回答