Java:设置接口和集合接口的区别

2022-09-02 01:21:33

我刚刚查找了界面,发现它大部分(或完全)只重新声明界面中已经存在的功能。 本身扩展,所以这是否意味着接口自动具有来自 的所有功能?那么,他们为什么要重新宣布呢?SetCollectionSetCollectionSetCollection

例如,重新声明以下内容:Set

/**
 * Returns the number of elements in this set (its cardinality).  If this
 * set contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
 * <tt>Integer.MAX_VALUE</tt>.
 *
 * @return the number of elements in this set (its cardinality)
 */
int size();

/**
 * Returns <tt>true</tt> if this set contains no elements.
 *
 * @return <tt>true</tt> if this set contains no elements
 */
boolean isEmpty();

以及以下声明:Collection

/**
 * Returns the number of elements in this collection.  If this collection
 * contains more than <tt>Integer.MAX_VALUE</tt> elements, returns
 * <tt>Integer.MAX_VALUE</tt>.
 *
 * @return the number of elements in this collection
 */
int size();

/**
 * Returns <tt>true</tt> if this collection contains no elements.
 *
 * @return <tt>true</tt> if this collection contains no elements
 */
boolean isEmpty();

这对我来说似乎非常多余。为什么不将接口定义为:Set

public interface Set<E> extends Collection<E> {}

我认为这些接口之间没有单一的区别,对吧?


当然,我不是在问关于的不同语义/含义。我知道那件事。我只是问它在技术上(即编译器)是否有任何区别。即,一般而言:Set

interface A { void foo(); }
interface B extends A { void foo(); }
interface C extends A {}

现在,在 或 之间有什么区别吗?ABC


虽然合同(即文档中所说的内容)对于某些功能(例如)确实可能有所不同,但有一个有效的理由重新声明它们:能够放置新文档,即定义新合同。add

但是,也有一些函数(如)具有完全相同的文档/合同。为什么他们也被重新宣布?isEmpty


答案 1

从技术上讲,对于编译器来说,它根本没有区别。

但是,集合不能有重复的条目,而集合可以。这是值得了解的。

因此,参数的方法语义,返回值和发生的事情可能意味着不同的事情。重新声明还允许javadoc变得更加具体。例如 add():

Set:如果此集尚未包含指定的元素,则@return true

集合:如果此集合由于调用而更改,则@return true

集合的含义更具体。

即使对于不更具体的方法,它也可以使javadoc更好。例如,对于 size(): “返回此集合中的元素数(其基数)”,这更接近于人们习惯于数学集合的语言。

API文档总结道:“Set接口除了从Collection接口继承的那些之外,还对所有构造函数的合约以及add,equals和hashCode方法的合约进行了额外的规定。为方便起见,此处还包括其他继承方法的声明。(这些声明附带的规范已针对 Set 接口进行了定制,但它们不包含任何其他规定。


答案 2

答案就在 java6 API for set 中。

“Set 接口除了从 Collection 接口继承的那些之外,还对所有构造函数的合约以及 add、equals 和 hashCode 方法的合约进行了额外的规定。为方便起见,此处还包括其他继承方法的声明。(这些声明附带的规范已针对 Set 接口进行了定制,但它们不包含任何其他规定。