Java 函数式接口
@author:Jingdai
@date:2020.09.07
概念
- 任何只有一个抽象方法的接口都是函数式接口。
- 自己定义函数式接口时,可以用
@FunctionalInterface
注解来标记这个接口,这么做有两个好处:
- 编译器会检查,如果接口有不止一个的抽象方法,编译器会报错。
- javadoc 页会指出这个接口是一个函数式接口
- 需要一个函数式接口的对象时,可以提供一个
lambda
表达式。- 不能将
lambda
表达式赋给Object
类型的变量,Object
不是函数式接口,但是赋值给接口之后可以再赋值给Object
。(有点绕,可以看后面的例子)
问题
不知道你们注意没有,函数式接口要求只有一个抽象方法,但是
Comparator
接口有两个抽象方法,但是Comparator
是一个典型的函数式接口。
按《Java核心技术·卷1》所述,Java API中这些接口重新声明 Object 中的方法来附加 javadoc 注释。
按我理解,接口中重新声明的Object 类中的方法不能算作抽象方法,因为这些方法永远无法被实现,在继承时有方法冲突的时候永远是超类优先,而Object类是所有类的超类,所以接口中声明这些方法永远用不到。这点可以参考默认方法冲突。
测试
使用
lambda
表达式public class Test { public static void main (String[] args