java - 'Comparable<T>' 应该是 'Functional interface' 吗?

标签 java interface lambda java-8 functional-interface

函数式接口(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/

相关文章:

java - 将 JSON 转换为 XML XmlMapper-Jackson 2.10

java - 在 Tomcat 中启用飞行记录器会导致 "Error when initializing JFR"

c++ - 在 C++ 状态机中实现事件条件

go - 使用接口(interface)作为参数创建另一个包的等效接口(interface)

c# - VLC 媒体播放器是否有 C# 接口(interface)?

c# - 如何使用方法调用作为参数

c++ - 为什么在模板化 lambda 时编译器生成的代码不同?

java - 如何使用 SQL 数据库在 Fragment 上创建 Adapter ListView?

java - 查找特定 JDK 版本的 "Samples and demos"

c++ - C++11 中的函数签名差异