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中再次编写这些方法?
答案 0 :(得分:28)
重写它们以便记录它们,以便指定List如何与Collection接口中指定的合同相比改进这些方法的合同。
例如,记录add()
中的List
方法以指定将元素添加到列表的末尾。这不能在Collection中指定,因为Collection没有开头和结尾。
答案 1 :(得分:13)
JavaDoc和API契约在某种程度上会发生变化,或者变得更加具体,因为你继续沿着继承层继续下去。
列表重新声明这些方法&amp;给他们更具体的JavaDoc。
答案 2 :(得分:6)
为方便起见。
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 MyInterface
比myCollection.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实现是有序的。