Java 中的 FuntionalInterface 注解类型

Rob*_*ert 2 java annotations interface

我正在阅读有关java注释的内容,出现了一个新的疑问。

在文档中解释了FunctionalInterface注释类型:

具有一个抽象方法声明的接口称为函数式接口。编译器会验证所有用 @FunctionalInterface 注解的接口,确保这些接口确实包含一个且仅一个抽象方法。如果使用此注释注释的接口不是函数式接口,则会生成编译时错误。在类、注释类型和枚举上使用此注释也是一个编译时错误。FunctionInterface 注释类型是标记接口。

我做了一些测试,我不需要用这个注释类型来标记我的接口。然后,我的问题是:如果每个具有一种方法的接口始终是函数式接口,为什么我需要这个注释?

示例代码

// @FunctionalInterface
interface Wizard {
    int spell(String power);
}

class TestLambda {
    public static void main(String[] args) {
        Wizard gandalf = str -> str.length();
        int power = gandalf.spell(args[0]);
        System.out.println("The spell length is: " + power+ " points");
    }
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 5

您不必使用注释来注释函数式接口@FunctionalInterface,但它会记录您创建函数式接口的意图,并且如果该接口不是函数式接口(即只有一个非默认和非静态方法),则会生成编译错误。

这有点像@Override:您不必使用它,但它会阻止您在重写方法时使用与父类不匹配的签名。

另请参阅:为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用?

  • 换句话说,注释对提供者有利,因为如果接口不起作用,它将生成编译错误 - 并且它对用户有利,因为它记录了该接口应在 lambda 中使用。 (3认同)