【发布时间】:2014-10-03 01:25:40
【问题描述】:
函数式接口的定义是“函数式接口是只有一个抽象方法的接口 (除了 Object 的方法),因此代表一个单一的函数合约。”
根据这个定义,Comparable<T> 绝对是一个函数式接口。
lambda 表达式的定义是“一个 lambda 表达式就像一个方法:它提供了形式参数的列表 和一个主体 - 一个表达式或块 - 用这些参数表示。”
对 lambda 表达式的求值会产生一个函数式接口的实例。
因此,lambda 表达式的目的是能够创建函数接口的实例,通过实现 功能接口的单一功能。 IE。允许使用单个函数创建实例。
让我们看看Comparable<T>,这个界面是设计成单一功能使用的吗?
IE。它是为创建仅具有这个单一功能的实例而设计的吗?
Comparable<T> 的文档以“此接口对每个类的对象施加总排序”开头
实现它。这种排序被称为类的自然排序,类的 compareTo 方法被称为
to 作为它的自然比较方法。”
上面这句话清楚地表明Comparable<T> 并非旨在用作单个函数,而是始终
意味着由一个类实现,它的实例具有自然顺序,通过添加这个单一的函数。
这意味着它不是为使用 lambda 表达式创建的?
关键是我们不会有任何只是 Comparable 的对象,它意味着被实现并因此被使用 作为类的附加功能。
那么,Java 语言中有没有一种方法可以防止为 Comparable<T> 创建 lambda 表达式?
接口的设计者是否可以决定该接口是由一个类实现而不是由一个类实现的?
通过使用 lambda 表达式使用这种单一方法创建为实例?
仅仅因为一个接口碰巧有一个抽象方法,它不应该被认为是一个函数式接口。
也许,如果Java提供了NotFunctional这样的注解,那么编译器就可以检查出这个接口没有被使用 用于创建 lambda 表达式,例如。
@NotFunctional
public interface Comparable<T> { public int compareTo(T t); }
【问题讨论】:
-
interfaces 无法控制它们的实现方式。那么为什么要改变 lambda 的情况呢?
标签: java interface lambda java-8 functional-interface