'Comparable <T>应该是'功能界面'吗?

use*_*727 22 java lambda interface java-8 functional-interface

功能接口的定义是"功能接口是一个只有一个抽象方法的接口(除了Object的方法),因此代表一个单一的功能契约."

根据这个定义,Comparable<T>它绝对是一个功能界面.

lambda表达式的定义是"lambda表达式就像一个方法:它提供了一个形式参数列表和一个正文 - 一个表达式或块 - 用这些参数表示."

lambda表达式的评估产生功能接口的实例.

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

让我们来看看Comparable<T>,这个界面是否设计用作单一功能?即.它是否仅用于创建具有此单一功能的实例?

Comparable<T>以"This接口开头的文档对每个实现它的类的对象施加了一个总排序.这个排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法."

上面的句子清楚地表明,Comparable<T>它不是设计用作单个函数,而是总是由一个类实现,它通过添加这个单个函数对其实例具有自然顺序.

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

关键是我们不会有任何仅仅是可比较的对象,它意味着要实现,因此用作类的附加功能.

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

仅仅因为接口恰好有一个抽象方法,它不应该被视为一个功能接口.

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

@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }
Run Code Online (Sandbox Code Playgroud)

Stu*_*rks 25

可以使用lambda表达式,其中需要具有单个抽象方法的接口的实例.你写了,

仅仅因为接口恰好具有单个抽象方法,所以不应将其视为功能接口.

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

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

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

  • @ user2363727文档可能是最好的.lambda是*legal*是语言的一部分,注释(大多数)不影响程序结构的合法性.像@NotFunctional这样的注释可能会生成一个警告但我似乎不会添加太多值.我很难想象有人可以尝试将lambda用于`Comparable`,这样会导致逻辑错误(与编译时错误相反).有人可以尝试,但他们很快意识到它没有意义.所以让编译器以某种方式检查它似乎并不值得. (3认同)
  • @Andrey类实现Comparable接口,允许将类的实例与该类的另一个实例进行比较.通常使用这些实例中包含的状态(字段)来完成比较.由于lambdas没有字段,因此很难想象lambda如何*有用地*实现Comparable,即使技术上可以编写一个可用的字符. (3认同)
  • @Karan 考虑“Comparable&lt;String&gt; c = s -&gt; 0”。它显然是一个 Comparable 并且它的实现是一个 lambda。然而,它不是一个很好的 Comparable:`c.compareTo("x")` 返回零,而 "x".compareTo(c) 甚至无法编译。(如果你可以编译它,调用它就会抛出 ClassCastException。) (2认同)

Hic*_*aid 7

问题来自"方法"和"功能"之间的细微差别.

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

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

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

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

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