gpt4 book ai didi

java - 'Comparable' 应该是 'Functional interface' 吗?

转载 作者:IT老高 更新时间:2023-10-28 20:46:14 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com