“可比较<T>”应该是“功能接口”吗?

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

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

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

lambda 表达式的计算会生成功能接口的实例。

因此,lambda 表达式的目的是能够通过实现函数接口的单个函数来创建函数接口的实例。即。以允许创建具有单个函数的实例。

让我们看一下,这个界面是设计为作为单个函数使用的吗?即。它是否专为创建仅具有此单个函数的实例而设计?Comparable<T>

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

上面的句子清楚地表明,不是设计为用作单个函数,而是始终意味着由一个类实现,该类通过添加此单个函数对其实例具有自然排序。Comparable<T>

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

关键是我们不会有任何对象只是可比的,它意味着实现,因此用作类的附加函数。

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

仅仅因为一个接口碰巧有一个抽象方法,它就不应该被视为一个功能接口。

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

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

答案 1

lambda 表达式可用于需要具有单个抽象方法的接口实例的情况。你写道,

仅仅因为一个接口碰巧具有单个抽象方法,它就不应该被视为一个功能接口。

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

值得注意的是,该接口缺少注释。Comparable@FunctionalInterface

虽然使用lambda作为实现可能是荒谬的,但似乎没有任何理由创建一种机制来防止这样做。这样做似乎不会成为错误的根源,这将是开发这种机制的一个很好的理由。相比之下,注释的目的是引导程序员朝着正确的方向前进,而不是禁止那些可以说是错误的,但似乎并不真正有害的东西。Comparable@FunctionalInterface


答案 2

问题来自“方法”和“函数”之间的细微差别。

函数的输出值仅取决于输入到该函数的参数。

但是,方法的输出取决于输入到函数的参数,但它也可能取决于对象的状态(实例变量)。

也就是说,任何函数都是方法,但并非所有方法都是函数。

例如,接口比较器中的方法比较仅取决于其参数。但是,接口中的 compareTo 方法 CompareT 取决于要比较的对象的状态,因此需要在类中实现它。

因此,即使Compaable也有一个abstarct方法,从语义上讲,它不应该被视为一个功能接口。