gpt4 book ai didi

Java:Set接口(interface)和Collection接口(interface)的区别

转载 作者:IT老高 更新时间:2023-10-28 20:40:42 25 4
gpt4 key购买 nike

我刚刚查看了 Set 接口(interface),发现它大部分(或完全)只重新声明了 Collection 接口(interface)中已经存在的函数。 Set 本身是 Collection 的扩展,所以这不是说 Set 接口(interface)自动拥有 Collection 的所有功能?那么为什么要重新声明呢?

例如,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 接口(interface)定义为:

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

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


当然,我不是在问 Set 的不同语义/含义。我知道。我只是在问它在技术上(即对编译器)是否有任何区别。即,笼统地说:

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

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


虽然契约(Contract)(即文档中所说的)对于某些功能(如 add)确实可能有所不同,但重新声明它们是有正当理由的:为了能够放置新文档,即定义新契约(Contract)。

但是,也有一些函数(如 isEmpty)具有完全相同的文档/契约(Contract)。为什么还要重新声明?

最佳答案

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

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

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

Set: @return 如果这个 set 还没有包含指定的元素,则返回 true

Collection: @return true 如果此集合因调用而改变

set的含义更具体。

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

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

关于Java:Set接口(interface)和Collection接口(interface)的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3978570/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com