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

应该'可比是“功能界面”?

井誉
2023-03-14
问题内容

功能接口的定义是“功能接口是仅具有一个抽象方法(除Object的方法之外)的接口,因此表示单个功能协定。”

根据此定义,Comparable<T>绝对是功能接口。

lambda表达式的定义是“ lambda表达式就像一种方法:它提供了形式参数的列表以及根据这些参数表示的主体(表达式或块)。”

对lambda表达式的求值将生成功能接口的实例。

因此,lambda表达式的目的是能够通过实现功能接口的单个​​功能来创建功能接口的实例。即。允许使用单个功能创建实例。

让我们来看一下Comparable<T>,该接口是否设计为可以用作单个功能?即。它是为仅使用此单个功能创建实例而设计的吗?

Comparable<T>开始的文档以“此接口对实现该接口的每个类的对象强加总排序。此排序称为类的自然排序,而该类的compareTo方法称为其自然比较方法。”

上面的句子清楚地表明,Comparable<T>并不是设计成将其用作单个函数,而是始终意味着要通过添加该单个函数的类对其实例进行自然排序来实现该类。

这意味着它不是设计为使用lambda表达式创建的吗?

关键是我们将没有任何对象只是可比较的,而是要实现的,因此可以用作类的附加功能。

那么,Java语言中有没有一种方法Comparable<T>可以防止为此创建lambda表达式呢?接口的设计者是否可以确定该接口是由一个类实现的,而不是要通过使用lambda表达式使用此单一方法作为实例创建的?

仅仅因为接口碰巧只有一个抽象方法,所以不应将其视为功能接口。

也许,如果Java提供了类似NotFunctional的注释,则编译器可以检查该接口是否不用于创建lambda表达式,例如。

@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }

问题答案:

如果需要使用单个抽象方法的接口实例,则可以使用lambda表达式。你写了,

仅仅因为接口碰巧具有单个抽象方法,所以不应将其视为功能接口。

这是完全正确的。具有单个抽象方法是接口的 结构 属性,该接口使它有资格使用lambda来实现。但是,接口 是有意义的 还是在 语义
上适合使用lambda实现则是另一回事。后者是@FunctionalInterface注释的目的。当其存在时的界面上时,表示 意图
,该接口是用一个lambda来实现有用的。

值得注意的是,该Comparable界面缺少@FunctionalInterface注释。

尽管使用lambda作为Comparable实现可能是荒谬的,但似乎没有任何理由创建一种机制来阻止这种情况的发生。这样做似乎不是错误的根源,这将是开发这种机制的一个很好的理由。相比之下,@FunctionalInterface注释旨在引导程序员朝
正确的 方向发展,而不是禁止可能是错误的但似乎没有真正危害的事情。



 类似资料:
  • Network(请求列表页面) Composer(构造请求) Log(日志平台) Rules(操作规则配置界面) Values(存放KeyValue的系统) Plugins(插件列表页面) WebSocket(WebSocket抓包功能) Filter(设置Network请求列表的过滤条件) Settings(设置对话框) Files(上传大块内容文件) Weinre(weinre列表) HTTP

  • 我使用lambda函数中的functional方法实现了函数接口。所有的工作都很好,只是我遇到了一个错误,即必须实现这个继承的抽象方法(在我的例子中是函数方法)。现在我很困惑。我使用lambda函数实现了这个函数方法,为什么我要再次实现这个方法。函数方法的实现是如何正确完成的?我的代码: 谢谢你的帮助。:)

  • 问题内容: 我已经看到了同时实现Comparable和Comparator的类。这是什么意思?为什么我要一个使用另一个? 问题答案: 下面的文字来自Comparator vs Comparable 可比 可比较的对象能够将自己与另一个对象进行比较。类本身必须实现java.lang.Comparable接口,以便能够比较其实例。 比较器 比较器对象能够比较两个不同的对象。该类不是在比较其实例,而是在

  • 问题内容: 我想知道这里发生了什么。 有一个http处理程序的接口: 我想我了解这种实现。 根据我的理解,“计数器”类型实现了接口,因为它具有一种具有所需签名的方法。到目前为止,一切都很好。然后给出这个例子: 有人可以详细说明为什么这些功能或如何将它们组合在一起吗? 问题答案: 这个: 说任何满足接口的类型都必须有一个方法。以上将在包装内。 这会将方法放在对应于ServeHTTP的Counter类

  • 问题内容: 两种方法中的哪一种符合W3C标准?它们在浏览器中的表现均符合预期吗? 边界:无; 边界:0; 问题答案: 两者均有效。 这是你的选择。 我喜欢,因为它更短。我觉得这更容易阅读。您可能会发现更清晰。我们生活在功能强大的CSS后处理器世界中,因此我建议您使用您喜欢的任何东西,然后通过“压缩机”运行它。这里没有值得战斗的圣战。 综上所述,如果您要手写所有的生产CSS,尽管评论中有些抱怨,但我

  • 问题内容: 当我看一看lambda表达式时,这本书涉及一个只有一种抽象方法的 功能接口 。我的问题针对该测验问题 我知道最后一个不是,但是我认为第一个和第二个应该是功能接口。但是书上说第二个不是。为什么?它不重写方法吗?因此,即使在第二秒,也不是只有一种抽象方法吗? 问题答案: 一种简单的查找方法是尝试定义一个实现的类。编译器会告诉您需要同时实现和。 您以为可以覆盖,这是可以理解的,但是它们实际上