Ant*_*hyn 66 lambda abstract java-8 functional-interface
最近我开始探索Java 8,我无法理解Java功能实现lambda表达式所必需的"功能接口"的概念.有一个非常全面的 Java函数中的lambda函数指南,但我仍然坚持用于定义函数接口概念的章节.定义如下:
更确切地说,功能接口被定义为具有恰好一个抽象方法的任何接口.
然后他进入示例,其中一个是Comparator界面:
Run Code Online (Sandbox Code Playgroud)public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(即Collections.sort(list, (a, b) -> a-b)).
但是在Comparator接口中,两者compare和equals方法都是抽象的,这意味着它有两个抽象方法.那么如果定义要求接口只有一个抽象方法,那么它如何工作呢?我在这里错过了什么?
Mar*_*ers 59
接口Comparator是有用的,因为虽然它声明了两个抽象方法,但其中一个 - equals-具有与Object中的公共方法相对应的签名.接口总是声明与Object的公共方法相对应的抽象方法,但它们通常是隐式的.无论是隐式声明还是显式声明,此类方法都会从计数中排除.
我真的不能说得更好.
编辑:根据莫里斯的评论更新到本页面的最新文本(谢谢!)
@FunctionalInterface页面给出了另一种解释:
从概念上讲,功能界面只有一种抽象方法.由于默认方法具有实现,因此它们不是抽象的.如果接口声明覆盖其中一个公共方法的抽象方法
java.lang.Object,那么也不会计入接口的抽象方法计数,因为接口的任何实现都将具有来自java.lang.Object其他地方的实现.
您可以测试它的接口是一个正确的功能接口使用 @FunctionalInterface.
例如:
这很有效
@FunctionalInterface
public interface FunctionalInterf {
void m();
boolean equals(Object o);
}
Run Code Online (Sandbox Code Playgroud)这会产生错误:
@FunctionalInterface
public interface FunctionalInterf {
void m();
boolean equals();
}
Run Code Online (Sandbox Code Playgroud)
在FunctionalInterf接口中找到多个非重写抽象方法