当前位置: 首页 > 知识库问答 >
问题:

Java接口中的可选方法

东门修文
2023-03-14

我注意到在一些接口中,比如Collection接口,有一些方法被注释为可选的,但这到底是什么意思呢?它让我有点困惑,因为我认为接口中指定的所有方法都是必需的?

共有1个答案

云景焕
2023-03-14

这里的答案似乎有很多混乱。

Java语言要求接口中的每个方法都由该接口的每个实现来实现。经期。这条规则没有例外。说“收藏是一个例外”意味着对这里真正发生的事情的理解非常模糊。

重要的是要认识到符合接口有两个层次:

考虑数组。它们实现了大多数列表操作,但不实现删除和添加。它们是“固定大小”的列表。如果您想在层次结构中捕获这个概念,您必须添加两个新接口:VariableSizeList和VariableSizeMap。您不必添加VariableSizeCollection和VariableSizeSet,因为它们将与ModifiableCollection和ModifiableSet相同,但是为了一致性,您可以选择添加它们。此外,您需要一个不支持添加和删除操作的新型ListIterator来支持不可修改列表。现在我们有十个或十二个接口,加上两个新的迭代器接口,而不是原来的四个。我们说完了吗?没有。

考虑日志(例如错误日志、审计日志和可恢复数据对象的日记)。它们是自然的仅追加序列,支持除remove和set(replace)之外的所有列表操作。它们需要一个新的核心接口和一个新的迭代器。

与不可修改的集合相反,不可变的集合呢?(即客户端无法更改且永远不会因任何其他原因更改的集合)。许多人认为这是最重要的区别,因为它允许多个线程同时访问一个集合,而不需要同步。将此支持添加到类型层次结构需要另外四个接口。

当Collections API中的方法被记录为“可选操作”时,这并不意味着您可以将方法实现排除在实现之外,也不意味着您可以使用空的方法体(首先,其中许多方法需要返回结果)。相反,这意味着有效的实现选择(仍然符合约定的选择)是抛出UnsupportedOperationException

注意,因为UnsupportedOperationExceptionRuntimeException,所以就编译器而言,您可以从任何方法实现中抛出它。例如,您可以从collection.size()的实现中抛出它。但是,这样的实现会违反约定,因为collection.size()的文档没有说明允许这样做。

旁白:Java的Collections API使用的方法有些争议(然而,现在可能比最初引入时少)。在一个完美的世界中,接口不会有可选的操作,而是使用细粒度的接口。问题是Java既不支持推断的结构类型,也不支持交叉类型,这就是为什么在集合的情况下,试图以“正确的方式”处理事情会变得极其困难。

 类似资料:
  • 问题内容: 据我了解,如果您使用Java实现接口,则实现该接口的子类必须使用该接口中指定的方法。 我注意到在某些接口(例如Collection接口)中,有一些方法被注释为可选方法,但这究竟意味着什么?我觉得接口中指定的所有方法都需要吗? 问题答案: 这里的答案似乎有很多混乱。 Java语言要求接口中的每种方法都必须由该接口的每种实现来实现。期。 这条规定没有例外。 说“收藏是一个例外”,这表明对这

  • 为了丰富运营体验,让开发者更好的体验积分商城功能,兑吧提支持更多的扩展功能 . 支持的扩展功能包含: 1. 游客用户唤醒登录 2. 自有虚拟商品充值 接口说明 充值接口API文档 通知接口API文档 3.加积分接口 接口说明 API文档 4.免登URL自定义参数 dcustom参数 transfer参数 signKeys参数 5. 会员等级功能 6.前置商品查询接口 7. 【秒杀商品】前置查询接口

  • 我试图使用以下代码理解Java接口中的默认方法,但我无法编译它: 编译器生成了以下输出: 我无法理解这些错误。我如何更正代码中的问题?

  • 此具有方法 我迷路了...有人能解释一下吗

  • 使用< code>Optional,我想根据映射结果返回接口的某个实现(< code>First或< code>Second)。这是< code>First和< code>Second实现的接口: 以下< code>Optional用法是错误的: orElse,可选 既然类<code>First<code>和<code>Second<code>都实现了接口<code>MyInterface<cod

  • 我有以下资料: > AJava类:ClassA实现观察者 Java接口:Inter(扩展可观察,不可能) Java类:ClassB实现可观察的内部扩展 Java类:ClassC实现可观察的内部扩展 现在ClassA的代码有点像这样。 现在,如果一个特定的事件发生在ClassB或ClassC中,我希望ClassA知道它。我想过使用观察者/可观察的,但问题是接口不能扩展可观察的。 如果有人理解这个问题