最近,我开始探索Java 8,但我不太了解“功能接口”的概念,该概念对于Java的lambda表达式实现至关重要。Java中有关于lambda函数的相当全面的指南,但是我陷入了为功能接口的概念定义的章节中。定义如下:更准确地说,功能接口定义为具有一种抽象方法的任何接口。然后他继续进行示例,其中之一是Comparator接口: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方法都是抽象的,这意味着它具有两个抽象方法。那么,如果定义要求一个接口仅具有一个抽象方法,那么这将如何工作?我在这里想念什么?
3 回答

开心每一天1111
TA贡献1836条经验 获得超13个赞
在同一页面上,您链接到:
接口Comparator之所以有用,是因为尽管它声明了两个抽象方法,但其中一个(等于)具有与Object中的公共方法相对应的签名。接口总是声明与Object的公共方法相对应的抽象方法,但是它们通常是隐式的。无论是隐式还是显式声明,此类方法均不包括在内。
我真的不能说得更好。

湖上湖
TA贡献2003条经验 获得超2个赞
从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果接口声明的抽象方法覆盖的公共方法之一java.lang.Object,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自java.lang.Object其他地方的实现。
您可以测试它的接口是一个正确的功能接口使用 @FunctionalInterface。
例如:
这有效
@FunctionalInterface
public interface FunctionalInterf {
void m();
boolean equals(Object o);
}
这会产生一个错误:
@FunctionalInterface
public interface FunctionalInterf {
void m();
boolean equals();
}
接口FunctionalInterf中提供的多个非覆盖抽象方法
添加回答
举报
0/150
提交
取消