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)
您不必使用注释来注释函数式接口@FunctionalInterface,但它会记录您创建函数式接口的意图,并且如果该接口不是函数式接口(即只有一个非默认和非静态方法),则会生成编译错误。
这有点像@Override:您不必使用它,但它会阻止您在重写方法时使用与父类不匹配的签名。
另请参阅:为什么 @FunctionalInterface 没有在 JDK 中符合条件的所有接口上使用?