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

“Comparable”应该是“Functional Interface”吗?

萧焱
2023-03-14

函数接口的定义是“函数接口是一个只有一个抽象方法(除了对象的方法)的接口,因此表示一个单一的函数契约。”

根据这个定义可比 肯定是一个功能接口。

lambda表达式的定义是“lambda表达式就像一个方法:它提供了一个形式参数列表和一个体--一个表达式或块--用这些参数表示。”

对lambda表达式的求值会生成函数接口的实例。

comparable 的文档以“此接口对实现它的每个类的对象施加总排序。此排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法。”

上面的句子清楚地表明,comparable 并不是用来作为一个函数使用的,而是要通过添加这个函数由一个类来实现的,这个类对其实例具有自然的顺序。

这意味着它不是通过使用lambda表达式来创建的?

重点是,我们不会有任何对象,它只是可比性的,它的意思是实现,因此作为一个类的附加函数使用。

那么,在Java语言中有没有一种方法可以防止为可比 创建lambda表达式呢?一个接口的设计者是否可以决定这个接口是由一个类来实现的,而不是由一个lambda表达式用这个单一的方法创建成一个实例?

仅仅因为一个接口碰巧有一个单一的抽象方法,它就不应该被认为是一个函数接口。

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

共有1个答案

能帅
2023-03-14

在需要具有单个抽象方法的接口实例的情况下,可以使用lambda表达式。你写了,

仅仅因为一个接口碰巧有单一的抽象方法,它不应该被认为是一个函数接口。

这一点完全正确。具有单个抽象方法是接口的一个结构属性,这使它有资格用lambda实现。然而,用lambda实现接口是否有意义或语义上是否合理则是另一回事。后者是@functionalinterface注释的目的。当它出现在接口上时,它表示该接口对于使用lambda实现是有用的。

特别要注意的是,comparable接口缺少@functionalinterface注释。

虽然使用lambda作为comparable实现可能是无稽之谈,但似乎没有任何理由创建一种机制来防止这种情况发生。这似乎不像这样做会是一个错误的来源,这将是一个很好的理由来发展这样一个机制。相比之下,@functionalinterface注释旨在引导程序员朝着正确的方向前进,而不是禁止一些可以说是错误的但看起来并不真正有害的东西。

 类似资料:
  • 我现在正在学习,我被赋予了一个简单的(我以为是这样的)任务。我必须让这段代码工作(我不能修改它): 我认为MousePressListener应该是FunctionalInterface,但它不能扩展MouseListener。有没有办法解决这个问题,或者我是从坏的方面来处理它?

  • 在学习 Lambda 表达式时,我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。@FunctionalInterface 就是用来指定某个接口必须是函数式接口,所以 @FunInterface 只能修饰接口,不能修饰其它程序元素。 函数式接口就是为 Java 8 的 Lambda 表达式准备的,Java 8 允许使用 Lambda 表

  • 问题内容: 我当前正在创建一个EJB3数据访问类,以处理Java EE 6应用程序中的所有数据库操作。现在,由于Java EE 6提供了新的注释,所以我想知道EJB应该具有什么状态,或者它应该是无状态的。 让DAO成为会话Bean还是Bean 会更好?那呢 这些与DAO相关的选项之间有什么区别? 编辑: 我在完整的Java EE 6平台上使用Glassfish 3.0.1 问题答案: 最好让DAO

  • 主要内容:1 什么是Java Comparable接口,2 Comparable compareTo方法,3 Java Comparable示例:升序,4 Java Comparable示例:倒序1 什么是Java Comparable接口 Java Comparable接口用于对用户定义的类的对象进行排序。该接口在java.lang包下,仅包含一个名为compareTo(Object) 的方法。它仅提供单个排序序列,意味着,您只能基于单个数据成员对元素进行排序。例如,可以是编号,名称,年龄或其

  • 问题内容: 我知道该ValueEventListener线程在新线程中运行,是否应该在任何时间删除此线程以进行适当的线程管理?(例如,没有太多并行运行的线程)。如果是,该怎么办? 问题答案: 在谈论监听器时,是的,您需要根据活动的生命周期将其删除,为此,您需要使用以下代码行: 请记住,如果不这样做,最终将浪费您的电池和带宽。所以: 如果已在中添加了侦听器,则onStart必须在中将其删除onSto

  • 首先,image视图具有以下配置(注意fitStart): 然后通过编程方式,对图像的高度进行小的修改,以匹配宽度(在activity.onResume()中)