【问题标题】:ArrayList in Java doesn't implement methods from Collection interface?Java中的ArrayList不实现Collection接口的方法?
【发布时间】:2017-05-30 18:51:00
【问题描述】:

我目前对这个问题有点困惑。我注意到 ArrayList 是一个实现 List 的类,而 List 又扩展了 Collection。

Collection<?> 中,我们有一堆方法,其中一个可识别的是containsAll()。我查看了ArrayList 的官方文档,但可以看到 Array list 没有这样的方法。在页面的页脚写了一些东西,说“继承的方法”和containsAll() 在那里提到。

我不明白(来自文档)是,containsAll() 是否已定义,即使它在 ArrayList 类中的主体为空,还是根本不定义?如果不是,这是否违反了 Java 规则?

还有其他人以同样的方式“失踪”?!

【问题讨论】:

  • “继承”!=“失踪”!你真的认为该语言附带的已发布的官方 Java API 会包含“某种违反 Java 规则的行为”吗?

标签: java inheritance multiple-inheritance


【解决方案1】:

containsAll() 方法由AbstractCollection 定义,AbstractList 扩展,而ArrayList 又扩展。所以ArrayList 继承了containsAll() 的实现。

考虑以下代码:

List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
boolean contains = list.containsAll(Arrays.asList("b", "c"));

这里,当list.containsAll()被调用时,实际上是在AbstractCollection中声明的方法被执行。

【讨论】:

    【解决方案2】:

    ArrayList 扩展了 AbstractList,后者扩展了 AbstractCollection

    你可以在那里找到它:

    如果此集合包含指定集合中的所有元素,则返回 true。

    这个实现迭代指定的集合,依次检查迭代器返回的每个元素,看它是否包含在这个集合中。如果所有元素都如此包含,则返回 true,否则返回 false。

    这里真正的答案基本上是:注意ArrayList的javadoc的top,在那里你可以找到继承树:

    java.lang.Object
      java.util.AbstractCollection<E>
        java.util.AbstractList<E>
          java.util.ArrayList<E>
    

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 2016-02-19
      • 2014-12-16
      • 1970-01-01
      • 2021-04-24
      • 1970-01-01
      • 2016-07-23
      • 1970-01-01
      相关资源
      最近更新 更多