Lambda_03 函数式接口@FunctionalInterface |8月更文挑战

222 阅读1分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

函数式接口@FunctionalInterface

在Lambda_01 中使用了Runnable举例,那么Runable为什么可以使用Lambda表达式呢? 通过阅读源代码分析: 在JDK1.8中Runable加入了注解==@FunctionalInterface:函数式接口== 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中方法,也不算抽象方法。