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

时间:2013-08-10 10:19:33

标签: java inheritance collections 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();
}

并且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();
}

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

8 个答案:

答案 0 :(得分:28)

重写它们以便记录它们,以便指定List如何与Collection接口中指定的合同相比改进这些方法的合同。

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

答案 1 :(得分:13)

JavaDoc和API契约在某种程度上会发生变化,或者变得更加具体,因为你继续沿着继承层继续下去。

列表重新声明这些方法&amp;给他们更具体的JavaDoc。

答案 2 :(得分:6)

为方便起见。

Same mentioned in Docs

  

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

答案 3 :(得分:3)

Collection<T>只是一组项目。 除了保留对其成员的许多项目的引用之外,它本身没有任何要求。

在基本的java api中,有两种主要类型的集合:List<T>Set<T>

List<T>有额外要求维护其所有项目的特定订单(广告订单,排序顺序......)。因此,如果您请求项目N,列表将始终返回N的相同项目。

Set<T>不对订单提供任何保证,但保证物品的唯一性。项目A不能两次添加到一个集合中,或者只能在一个集合中出现一次。

你应该熟悉&#34;标记&#34;接口。 Serializable就是其中之一,通常是谈论这个时的基本例子。并且List<T>Set<T>被声明为这样,它们将集合标记为一个或另一个,以便通知程序员他们可以从他们收到的集合中获得的行为。

请参阅&#34; Effective Java&#34;的第37项(第6章)。有关如何比使用注释更好的解释。

还有一个事实是myCollection instanceof MyInterfacemyCollection.getClass().isAnnotationPresent(MyAnnotation.class)myCollection.getClass().getAnnotation(MyAnnotation.class) != null更快。

答案 4 :(得分:2)

toArray方法上的签名表明您从已编译的.class文件中提取了此签名。 class file format指定.class文件不重复从超接口继承的方法,所以我怀疑你用来获取这些的任何工具都向你展示了一个复合视图;这些方法实际上并不存在于List

答案 5 :(得分:2)

集合只是项目的集合

除了保存项目列表之外,列表还添加了有关序列的信息 东西给它。

将项目添加到集合时,您只需添加它。 向List添加项目时,可以在 n

位置添加

从集合中删除项目时,您只是将其删除。 从列表中删除项目时,可以在 n

位置删除

如果要从集合中获取项目,则必须进行迭代。 当您想从列表中获取项目时,您可以到达 n

的位置

答案 6 :(得分:1)

首先,接口List继承所有Collection方法,因此Collection接口中存在的所有方法也将存在于List接口中,但List接口有额外的方法(由ur self检查),它描述了list的行为

答案 7 :(得分:1)

主要是因为他们使用过这样的文档目的。

例如

Collection#retainAll 

仅保留指定集合中包含的集合中的元素(可选操作)。

List#retainAll

仅保留指定集合中包含的列表中的元素(可选操作)。

仅用于java doc目的,他们就是这样使用过的。但是一些方法行为本身也发生了变化。

For ex.add,remove

删除方法

In List, Removes the first occurrence of the specified element from this list, if it is present (optional operation).

In Collection , Removes a single instance of the specified element from this collection, if it is present (optional operation).

通过Java doc,他们清楚地表明List实现是有序的。

相关问题