这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
函数式接口@FunctionalInterface
在Lambda_01 中使用了Runnable举例,那么Runable为什么可以使用Lambda表达式呢? 通过阅读源代码分析: 在JDK1.8中Runable加入了注解==@FunctionalInterface:函数式接口==
什么样的接口是函数式接口
接口中==有且只有==一个抽象方法的函数接口,==多了编译将报错。==
interface LambdaInterface4{
//抽象方法fun1
public void fun1();
//抽象方法fun2
public void fun2();
}
咦?上面代码怎么没有报错?
==因为上面代码压根就不算是函数式接口== 我们实现以下试试
public class Lambda04 {
public static void main(String[] args) {
LambdaInterface4 lambdaInterface4 = new LambdaInterface4() {
@Override
public void fun() {
}
@Override
public void fun2() {
}
};
}
}
interface LambdaInterface4{
public void fun();
public void fun2();
}
上面代码是实现Java接口,==不是函数接口==,你可以尝试使用Lambda表达式试试。用不了。 且LambdaInterface4也不能被==@FunctionalInterface== 注释。因为接口中有两个抽象方法。 注释掉fun2方法:完美解决报错。
@FunctionalInterface 注释中可以有其他方法。
@FunctionalInterface
interface LambdaInterface{
// 抽象方法
public void fun();
// java.lang.Object中的方法不是抽象方法
public boolean equals(Object var1);
// default不是抽象方法
public default void defaultMethod(){}
// static不是抽象方法
public static void staticMethod(){}
}
使用@FunctionalInterface 的规则
- 有且仅有一个抽象方法
- 静态方法和默认方法,都不算是抽象方法
- 接口默认继承java.lang.Object,接口显示声明覆盖了Object中方法,也不算抽象方法。