众所周知,Java 8向Java开发人员引入了函数式编程。
Comparator、Runnable、Callable等接口都是功能性的。
从定义上看:函数接口是只有一个抽象方法的接口。
但是,例如,同一个接口Comparator有多个抽象方法:
int compare(T o1, T o2);
boolean equals(Object obj); // inherited from Object class
// and a lot of concrete methods more那么,对于如何确定接口是否为函数,是否有严格的规则,以便它可以用作lambda表达式或方法引用的赋值目标?
发布于 2016-09-23 08:31:54
来自JLS第9.8节 (突出显示我的):
函数接口是一个只有一个抽象方法的接口(,除了对象的方法)。
理由是
Object,因此无论如何都实现了这些抽象方法。
另一个方法- boolean equals(Object) -是一个抽象方法的显式声明,否则将被隐式声明,并将由实现接口的每个类自动实现。Object定义的方法。因此,在搜索要调用的方法时,这些方法不算在内(因为函数接口的方法可以在不命名该方法的情况下调用)。
这是为了允许对像java.util.Comparator<T>这样的接口进行功能处理,它声明了多个抽象方法,其中只有一个是真正的“新”方法-- int compare(T,T)。https://stackoverflow.com/questions/39655998
复制相似问题