Java 为什么列表接口扩展了集合接口?

Java 为什么列表接口扩展了集合接口?,java,inheritance,collections,interface,Java,Inheritance,Collections,Interface,集合接口有多个方法。列表接口扩展了集合接口。它声明了与集合接口相同的方法?为什么会这样 比如说 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

集合接口有多个方法。列表接口扩展了集合接口。它声明了与集合接口相同的方法?为什么会这样

比如说

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();
}
接口集合扩展了Iterable
{
公共抽象int size();
公共抽象布尔值为空();
公共抽象布尔包含(java.lang.Object);
公共抽象java.util.Iterator Iterator();
公共抽象java.lang.Object[]toArray();
公开摘要T[]toArray(T[]);
公共抽象布尔加法(E);
公共抽象布尔删除(java.lang.Object);
公共抽象布尔containsAll(java.util.Collection);
公共抽象布尔addAll(java.util.Collection);
公共抽象布尔保留(java.util.Collection);
公开摘要无效清除();
公共抽象布尔等于(java.lang.Object);
公共抽象int hashCode();
}
列表界面也有同样的方法:

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();
}
公共接口列表扩展集合
{
公共抽象int size();
公共抽象布尔值为空();
公共抽象布尔包含(java.lang.Object);
公共抽象java.util.Iterator Iterator();
公共抽象java.lang.Object[]toArray();
公开摘要T[]toArray(T[]);
公共抽象布尔加法(E);
公共抽象布尔删除(java.lang.Object);
公共抽象布尔containsAll(java.util.Collection);
公共抽象布尔addAll(java.util.Collection);
公共抽象布尔保留(java.util.Collection);
公开摘要无效清除();
公共抽象布尔等于(java.lang.Object);
公共抽象int hashCode();
}

如果列表已经扩展了收集接口,是否需要在列表中再次写入这些方法?

编写这些方法是为了记录它们,以便指定列表与收集接口中指定的契约相比如何细化这些方法的契约


例如,
List
中的
add()。这不能在集合中指定,因为集合没有开始和结束。

随着继承继承继承权的向下移动,JavaDoc和API契约会发生一些变化/或变得更加具体


列表重新声明了这些方法,并为它们提供了更具体的JavaDoc。

只是为了方便。

列表接口在迭代器、add、remove、equals和hashCode方法的契约上放置了除集合接口中指定的之外的附加规定。为了方便起见,这里还包括其他继承方法的声明


toArray
方法上的签名表明您是从编译的
.class
文件中提取的。指定
.class
文件不重复从SuperInterface继承的方法,因此我怀疑您用于获取这些方法的任何工具都显示了一个复合视图;这些方法实际上并不存在于
列表中

集合只是一个项目集合

列表除了包含项目列表外,还添加了有关项目顺序的信息 跟它有关的东西

将项目添加到集合时,您只是在添加它。 将项目添加到列表时,可以在位置n处添加

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

当您想从集合中获取项时,必须进行迭代。 当您想从列表中获取一个项目时,您可以在位置n处获取集合,集合只是一组项目。 就其本身而言,它没有比保存对其成员的许多项的引用更多的要求

在基本JavaAPI中,有两种主要类型的集合:
List
Set

列表
有额外的要求来维护其所有项目的特定顺序(插入顺序、排序顺序等)。因此,如果您请求N项,列表将始终返回相同的N项

Set
不对订单提供任何保证,但对项目的唯一性提供保证。项目A不能在集合中添加两次,或在集合中仅显示一次

您应该熟悉“标记”界面的实践
Serializable
就是其中之一,通常是讨论此问题时的基本示例。和
List
Set
声明为这样,它们将集合标记为一个集合或另一个集合,以便通知程序员他们可以从接收的集合中预期的行为

请参阅“有效Java”的第37项(第6章),以获得关于如何比使用注释更好的非常好的解释


还有一个事实是,
MyInterface的myCollection实例
myCollection.getClass().isAnnotationPresent(MyAnnotation.class)
myCollection.getClass().getAnnotation(MyAnnotation.class)!=null

首先,接口列表继承了所有的收集方法,因此收集接口中存在的所有方法也将存在于列表接口中,但是列表接口有额外的方法(请自行检查),这些方法描述了列表的行为,这主要是因为它们这样使用了文档目的

比如说

Collection#retainAll 
仅保留此集合中包含在指定集合中的元素(可选操作)

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

只是出于java文档的目的,他们才这样使用。但有些方法行为本身发生了变化

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文档,他们清楚地表明列表实现是有序的
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).