为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用?

2023-12-23

Java 8 为我们提供了许多有趣的方法来使用函数式接口以及新的注释:@功能接口 http://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html。它的工作是告诉编译器如果我们不遵守函数式接口的规则就向我们大喊大叫(请只需要重写一个抽象方法)。

java.util.function包中的43个接口 https://stackoverflow.com/questions/27743315/a-summary-of-the-parameters-and-return-type-of-functional-interfaces-in-the-pack/28162720#28162720与此注释。搜索jdk.1.8.0/src@FunctionalInterface仅出现 57 个点击。为什么可以添加其他接口(例如 AutoCloseable)@FunctionalInterface还失踪吗?

里面有一点模糊的暗示注释文档 http://docs.oracle.com/javase/8/docs/api/java/lang/FunctionalInterface.html:

“用于指示接口类型声明的信息注释类型intended成为一个功能性接口”

有什么充分的理由不intend我设计的一个接口(可能只是一个功能性接口)不能用作一个接口?除了没有意识到可以添加它之外,将其省略是否还表明有什么?

向任何已发布的接口添加抽象方法是否不会让任何实现它的人陷入困境,无论是否功能正常?假设他们只是懒得去追捕他们,我感到愤世嫉俗,但还有什么其他解释呢?

Update: 看完之后“‘可比较’应该是‘功能性接口’吗?” https://stackoverflow.com/questions/25222575/should-comparablet-be-a-functional-interface我发现我仍然有一些挥之不去的问题。当单一方法接口和功能接口在结构上相同时,还有什么不同呢?区别只是名字吗? Comparable 和 Comparator 在语义上非常接近。事实证明它们在结构上是不同的,所以仍然不是最好的例子......

是否存在这样的情况:SMI 在结构上可以很好地用作功能接口,但仍然不鼓励接口名称和方法的语义含义?或者也许是 Javadocs 隐含的契约?


好吧,如果您假设总是给出该意图,那么记录意图的注释将毫无用处。

你命名了这个例子AutoCloseable这显然是not旨在作为函数实现,因为有Runnable这对于具有以下功能的函数来说要方便得多()->void签名。它的目的是一个类实现AutoCloseable管理通过 lambda 表达式实现的匿名类无法管理的外部资源。

一个更清楚的例子是Comparable, an interface不仅不打算作为 lambda 表达式实现,而且也不可能使用 lambda 表达式正确实现它。


未标记的可能原因interface with @FunctionalInterface举例来说:

  • The interface具有编程语言语义,例如AutoClosable or Iterable(对于您自己的界面来说,这种情况不太可能发生)
  • 预计不会interface具有任意实现和/或比实际实现更多的标识符,例如java.net.ProtocolFamily, or java.lang.reflect.GenericArrayType(请注意,后者还将继承default实施getTypeName()对于 lambda 实现来说毫无用处,因为依赖toString())
  • 此类事例interface应该有一个身份,例如java.net.ProtocolFamily, java.nio.file.WatchEvent.Modifier等等。请注意,这些通常由enum

    另一个例子是java.time.chrono.Era恰好只有一个abstract方法但是它的规格 http://docs.oracle.com/javase/8/docs/api/java/time/chrono/Era.html说“实例Era可以使用以下方法进行比较==操作员。”

  • The interface旨在改变操作的行为,该操作的实现interface不继承/实现其他任何东西都是没有意义的,例如java.rmi.server.Unreferenced
  • 它是类的常见操作的抽象,它应该不仅仅具有这些操作,例如java.io.Closeable, java.io.Flushable, java.lang.Readable
  • 预期的继承是合约的一部分,并禁止 lambda 表达式实现,例如在java.awt: ActiveEvent应由一个AWTEvent, PrinterGraphics by a Graphics,同样适用于java.awt.print.PrinterGraphics(嘿,两个interfaces 表示完全相同的事情......),而javax.print.FlavorException应由一个javax.print.PrintException子类
  • 不知道各种事件监听接口是不是没有标注@FunctionalInterface为了与其他不能是函数式接口的多方法事件监听器对称,但实际上事件监听器是 lambda 表达式的良好候选者。如果您想稍后删除侦听器,则必须存储实例,但这与例如没有什么不同。内部类监听器实现。
  • 库维护者拥有一个包含 200 多种候选类型的大型代码库,但没有足够的资源来讨论每个类型interface是否应该对其进行注释,因此重点关注在功能上下文中使用的主要候选者。我确信,例如java.io.ObjectInputValidation, java.lang.reflect.InvocationHandler, juc RejectedExecutionHandler & ThreadFactory不会那么糟糕@FunctionalInterface但我不知道是否,例如java.security.spec.ECField是一个好的候选人。图书馆越通用,图书馆的用户就越有可能回答特定问题interface他们感兴趣,但坚持让图书馆维护者回答是不公平的all接口。

    在这种情况下,看到一个@FunctionalInterface作为一条消息interface绝对是为了与 lambda 表达式一起使用,而不是将注释的缺失视为不打算以这种方式使用的指示符。这就像编译器处理它一样,您可以实现每个抽象方法interface使用 lambda 表达式,但是当注释存在时它会ensure你可以使用这个interface这样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用? 的相关文章

随机推荐

  • Hyperledger Fabric v1.0 上的隐私

    您能否解释一下 Hyperledger Fabric v1 0 中的一些隐私机制 那些已经实现的以及计划在未来实现的机制 我知道渠道就像单独的区块链 我还浏览了该文档https jira hyperledger org browse FAB
  • tabindex="-1" 的模态将焦点放在选项卡上

    我目前正在使用 Twitter Bootstrap 并且在模态的 tabindex 中遇到一个奇怪的问题 我试图通过模式内的表单元素进行切换 但在最后一个按钮之后 焦点在返回到关闭按钮之前消失了 我在控制台中添加了一行来记录正在聚焦的元素
  • 在 Meteor 事件处理程序中访问模板帮助程序字典

    在 Meteor 中 我将两个对象从我的数据库发送到模板 Template myTemplate helpers helper1 function var object1 this data context set in iron rout
  • Route53 中 A Rec 和 CNAME 之间的区别

    由于Amazon Route 53允许您使用Alias将A记录或CNAME设置为不同的子域名 我现在想知道A记录和CNAME之间有什么区别 为了澄清我的问题 传统NameServer中的CNAME和A记录之间的区别在于 只有CNAME可以用
  • 调用多个api url并同时调用

    我有三个 API url 每个都有相同的对象名称 我希望同时调用所有 api 到目前为止我的js document ready function var first https first var second https second v
  • 确定 JavaScript e.keyCode 是否为可打印(非控制)字符

    我只是想知道 JavaScript 的范围keyCode对应于可输入字符的 s 或者 不可输入 控制 字符的范围 如退格 转义 命令 移位等 这样我就可以忽略它们 我问的原因是打电话String fromCharCode 导致控制键出现奇数
  • UIView 中只有白色填充颜色是透明的

    我有一个UIView即设置为opaque NO一切都很好 在里面drawRect我正在做自定义绘图 这有效 CGContextSetFillColor context CGColorGetComponents UIColor blueCol
  • 在Tomcat上部署war文件

    有没有办法在 Tomcat 服务器上部署给定的 war 文件 我想在不使用网络界面的情况下执行此操作 部署 Tomcat Web 应用程序有多种方法 正如已经提到的 进入 CATALINA HOME webapps Using your b
  • 如何在 Flutter 中处理 Android 设备的 BACK 按钮按下?

    如何处理设备后退按钮onPressed Android 版 Flutter 中 我知道我必须为 iOS 手动添加一个后退按钮 但 Android 设备有内置的后退按钮 用户可以按下它 怎么处理呢 您可以使用WillPopScope为了达成这
  • 有没有办法在 r 中自动重新安装软件包及其依赖项?

    所以我在Rstudio上使用installR将R更新到版本4 0 0 并将我的包文件复制到R中的库文件中 目录是 C Users Ibrahim Documents R R 4 0 0 library 每当我调用一个包时 例如 tidyte
  • 在 Linux 命令行中使用低功耗蓝牙

    我正在研究在 Linux 上使用蓝牙低功耗调制解调器 我正在使用命令行选项 即hcitool 我可以使用以下命令找到设备 hcitool scan 它对我来说工作正常 我也可以使用以下方式广播我的设备 sudo hciconfig hci0
  • RecyclerView 中最后一个子元素的边距/填充

    我试图在最后一行添加填充 边距底部 并在第一行添加填充 边距顶部 我不能在项目 xml 中执行此操作 因为它会影响我所有的孩子 我的 RecyclerView 适配器中有标题和子项 所以我无法使用 android padding 4dp a
  • Django REST Framework 序列化速度极慢

    我使用的是 Python 2 7 和 Django 1 7 1 以及 django rest 框架 我有一个 API 它返回一些从数据库中获取的特定值 它使用如下所示的自定义序列化器 class InventarioSerializer s
  • 使用 MLCP 复制数据时出现异常

    我正在尝试使用 MLCP 将 100 万个文档从一个数据库复制到另一个数据库 但出现以下异常 19 08 30 11 48 08 ERROR contentpump DatabaseContentReader RuntimeExceptio
  • 我如何搜索文件并将它们压缩到一个 zip 文件中

    我尝试使用以下命令搜索文件并压缩它们 find regexpression exec zip 但是它不起作用 我怎样才能做到这一点 您使用的命令将分别对每个文件运行 zip 请尝试以下操作 find name
  • IIS 站点和 nant/nantcontrib?

    是否可以使用 NAnt 管理 IIS Web 应用程序 例如停止或启动它 Nant 具有 servicecontroller 任务 您可以使用它仅停止 启动 Web 服务器或整个 IIS 我通常使用它来停止 启动 Web 服务器
  • 如何在 php 中正确为我的 tbl_item 制作下拉列表菜单

    我的下拉列表菜单遇到问题 它不断出现 wamp 错误 我的下拉列表菜单将来自 tbl 项目的项目名称 postgres DB funcContainer php 页面 function DropdownListMenu label name
  • 扩展 MIDL 接口和 COM 对象设计

    我读过有关各种 COM 设计模式的详细信息COM 程序员的食谱 http msdn microsoft com en us library ms809982 aspx以及一些相关的 SO 线程 特别是讨论组合与多重继承的线程 https s
  • 我的插件未正确更新(upgrader_process_complete 问题)

    我有安装了我的插件的用户 我们将其称为 v6 我的插件的 V6 版本没有注册处理程序upgrader process complete 在我的新版本中 我有upgrader process complete注册对我的数据库表进行一些升级 然
  • 为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用?

    Java 8 为我们提供了许多有趣的方法来使用函数式接口以及新的注释 功能接口 http docs oracle com javase 8 docs api java lang FunctionalInterface html 它的工作是告