函数式接口(interface)的定义是“函数式接口(interface)是只有一个抽象方法的接口(interface) (除了 Object 的方法),因此代表一个单一的函数合约。”
根据这个定义,Comparable<T>
绝对是功能接口(interface)。
lambda 表达式的定义是“一个 lambda 表达式就像一个方法:它提供了形式参数的列表 和一个主体 - 一个表达式或 block - 用这些参数表示。”
对 lambda 表达式的求值会产生一个函数式接口(interface)的实例。
因此,lambda 表达式的目的是能够创建函数接口(interface)的实例,通过实现 功能接口(interface)的单一功能。 IE。允许使用单个函数创建实例。
让我们看看Comparable<T>
,这个界面是为单一功能设计的吗?
IE。它是为创建仅具有这个单一功能的实例而设计的吗?
Comparable<T>
的文档以“此接口(interface)对每个类的对象施加总排序
实现它。这种排序被称为类的自然排序,类的 compareTo 方法被称为
to 作为它的自然比较方法。”
上面这句话清楚地表明Comparable<T>
并非旨在用作单个功能,而是始终
意味着由一个类实现,它的实例具有自然顺序,通过添加这个单一的函数。
这意味着它不是为使用 lambda 表达式创建的?
关键是我们不会有任何只是 Comparable 的对象,它意味着被实现并因此被使用 作为类的附加功能。
那么,Java 语言中有没有一种方法可以为 Comparable<T>
创建一个 lambda 表达式?被阻止?
接口(interface)的设计者是否可以决定这个接口(interface)是由一个类实现而不是由一个类实现的?
通过使用 lambda 表达式使用这种单一方法创建为实例?
仅仅因为一个接口(interface)碰巧有一个抽象方法,它不应该被认为是一个函数式接口(interface)。
也许,如果Java提供了NotFunctional这样的注解,那么编译器就可以检查出这个接口(interface)没有被使用 用于创建 lambda 表达式,例如。
@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }
最佳答案
当需要具有单个抽象方法的接口(interface)实例时,可以使用 lambda 表达式。你写的,
Simply because an interface happens to have single abstract method, it should not be considered as a functional interface.
这完全正确。拥有一个抽象方法是接口(interface)的一个 结构 属性,它使它有资格用 lambda 实现。然而,一个接口(interface)有意义还是语义是否适合用 lambda 实现是另一回事。后者是 @FunctionalInterface
注释的目的。当它出现在接口(interface)上时,它表明 intent 该接口(interface)对于使用 lambda 实现是有用的。
值得注意的是,Comparable
接口(interface)缺少 @FunctionalInterface
注释。
虽然将 lambda 用作 Comparable
实现可能是荒谬的,但似乎没有任何理由创建一种机制来防止这种情况发生。这样做似乎不会成为错误的来源,这将是开发这种机制的一个很好的理由。相比之下,@FunctionalInterface
注释旨在 Bootstrap 员朝正确 的方向发展,而不是禁止一些可以说是错误但似乎并不真正有害的事情。
关于java - 'Comparable<T>' 应该是 'Functional interface' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222575/