当前位置: 首页 > 面试题库 >

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

柳绪
2023-03-14
问题内容

我只是查看了Set接口,发现它主要(或完全)仅重新声明了Collection接口中已经存在的函数。Set本身可以扩展Collection,这是否意味着Set接口自动具有的所有功能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接口定义为:

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

我认为这些接口之间没有任何区别,对吗?

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

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

现在AB或之间有什么区别C吗?

尽管某些功能(如add)的合同(即文档中所说的)确实可能有所不同,但有一个合理的理由要重新声明它们:能够放置新的文档,即定义新的合同。

但是,也有一些功能(如isEmpty)具有完全相同的文档/合同。为什么还要重新申报?


问题答案:

从技术上讲,对于编译器而言,它没有任何区别。

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

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

设置:@return如果此设置尚未包含指定的元素,则为true

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

set的含义更具体。

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

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



 类似资料:
  • 进入项目页,可以看到项目下的所有接口,需要注意的是,YApi有 接口集合 和 测试集合 两个概念。 接口集合 将接口进行分类,使接口结构更清晰,一个接口只能属于一个集合,且不允许与其他接口重名。 测试集合 为了方便我们测试接口,测试集合 将若干接口组合在一起,在这里一个接口可以属于不同集合。 接口配置 新建接口 后,点击新添加的接口,右侧可以看到接口的预览信息,点击右侧的 编辑 Tab项进入编辑面

  • 本文向大家介绍实现Runnable接口和Callable接口的区别?相关面试题,主要包含被问及实现Runnable接口和Callable接口的区别?时的应答技巧和注意事项,需要的朋友参考一下 如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可以被ThreadPoolExecutor或ScheduledThreadP

  • 在Java中设计并发线程时,使用和接口有什么区别,为什么要选择其中一个?

  • 本文向大家介绍浅析Java中comparator接口与Comparable接口的区别,包括了浅析Java中comparator接口与Comparable接口的区别的使用技巧和注意事项,需要的朋友参考一下 Comparable 简介 Comparable 是排序接口。 若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实

  • 假设定义了以下类型: 现在,考虑以下方法来向该类型添加附加属性: 扩大 交叉口 这两种方法有什么区别? 而且,为了完整性和好奇心,还有其他方法可以产生类似的结果吗?

  • 这可能是一个Java101问题。但是我已经离开java十年了,所以它对我来说是新的。 而且,changeFurColor()使用实现 的比较器对输入ArrayList进行排序,因此我需要在changeFurColor()方法中使用这个参数化类型。 我用changeFurColor(dogs)调用方法; 但是,这不会编译。类型 与类型 不匹配,尽管前者实现了后者。 伪代码: 更新changeFurC