为什么List接口扩展Collection接口?

use*_*839 17 java collections inheritance interface

Collection接口有多种方法.List接口扩展了Collection接口.它声明与Collection接口相同的方法?为什么会这样?

例如

interface Collection extends Iterable
{
     public abstract int size();
 public abstract boolean isEmpty();
 public abstract boolean contains(java.lang.Object);
 public abstract java.util.Iterator<E> iterator();
 public abstract java.lang.Object[] toArray();
 public abstract <T extends java/lang/Object> T[] toArray(T[]);
 public abstract boolean add(E);
 public abstract boolean remove(java.lang.Object);
 public abstract boolean containsAll(java.util.Collection<?>);
 public abstract boolean addAll(java.util.Collection<? extends E>);
 public abstract boolean removeAll(java.util.Collection<?>);
 public abstract boolean retainAll(java.util.Collection<?>);
 public abstract void clear();
 public abstract boolean equals(java.lang.Object);
 public abstract int hashCode();
}
Run Code Online (Sandbox Code Playgroud)

List接口中也存在相同的方法:

public interface List extends Collection
{
 public abstract int size();
 public abstract boolean isEmpty();
 public abstract boolean contains(java.lang.Object);
 public abstract java.util.Iterator<E> iterator();
 public abstract java.lang.Object[] toArray();
 public abstract <T extends java/lang/Object> T[] toArray(T[]);
 public abstract boolean add(E);
 public abstract boolean remove(java.lang.Object);
 public abstract boolean containsAll(java.util.Collection<?>);
 public abstract boolean addAll(java.util.Collection<? extends E>);
 public abstract boolean removeAll(java.util.Collection<?>);
 public abstract boolean retainAll(java.util.Collection<?>);
 public abstract void clear();
 public abstract boolean equals(java.lang.Object);
 public abstract int hashCode();
}
Run Code Online (Sandbox Code Playgroud)

如果已经扩展Collection接口,是否需要在List中再次编写这些方法?

JB *_*zet 28

它们被重写以便可以对它们进行记录,以便指定List如何与Collection接口中指定的契约相比改进这些方法的契约.

例如,记录add()方法List以指定将元素添加到列表的末尾.这不能在Collection中指定,因为Collection没有开头和结尾.

  • 很好的答案,特别是与`List.add()`合同的例子. (2认同)

Tho*_*s W 13

随着你继承heirarchy,JavaDoc和API契约会有所改变/或变得更具体.

List重新声明这些方法并为它们提供更具体的JavaDoc.


Sur*_*tta 6

只是为了方便.

在Docs中也提到过

List接口在迭代器,add,remove,equals和hashCode方法的契约上放置了除Collection接口中指定的规则之外的其他规定.为方便起见,此处还包含其他继承方法的声明