函数式接口的定义是“函数式接口是只有一个抽象方法(除了 Object 的方法)的接口,因此代表一个单一的函数契约。”
根据这个定义,Comparable<T>
绝对是一个函数式接口。
lambda 表达式的定义是“一个 lambda 表达式就像一个方法:它提供了一个形式参数列表和一个主体 - 一个表达式或块 - 用这些参数表示。”
对 lambda 表达式的求值会生成一个功能接口的实例。
因此,lambda 表达式的目的是能够通过实现功能接口的单个函数来创建功能接口的实例。IE。允许使用单个函数创建实例。
让我们看一下Comparable<T>
,这个界面是为单一功能设计的吗?IE。它是为创建仅具有此单个功能的实例而设计的吗?
的文档Comparable<T>
以“此接口对实现它的每个类的对象施加总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。”
上面这句话清楚地表明,Comparable<T>
它并非旨在用作单个函数,而是始终由一个类实现,该类通过添加这个单个函数对其实例具有自然顺序。
这意味着它不是设计为使用 lambda 表达式创建的?
关键是我们不会有任何只是 Comparable 的对象,它旨在被实现并因此用作类的附加功能。
那么,Java 语言中有没有一种方法Comparable<T>
可以防止创建 lambda 表达式?接口的设计者是否可以决定该接口是由一个类实现的,而不是通过使用 lambda 表达式使用这个单一方法创建为实例的?
仅仅因为一个接口碰巧有一个抽象方法,它不应该被认为是一个功能接口。
也许,如果 Java 提供了 NotFunctional 之类的注解,编译器可以检查该接口不用于创建 lambda 表达式,例如。
@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }