2017-05-30 53 views
-1

我目前对这个问题有点困惑。我注意到ArrayList是一个实现List的类,它继而扩展了Collection。Java中的ArrayList没有实现Collection接口的方法?

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

我不明白(从文档)是,是否containsAll()定义,即使它在ArrayList类中有一个空体或根本没有?如果没有,这是否违反了Java的规则?

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

+0

“继承” =“失踪”!您是否真的认为随该语言发布的官方Java API将包含“某种违反Java规则的行为”? –

回答

5

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声明的方法。

3

ArrayList扩展AbstractList,它扩展了AbstractCollection

而且那里你可以找到它:

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

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

基本上这里真正的答案是:要注意的Javadoc的ArrayList 顶部,那里你可以找到继承树:

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