当前位置: 首页 > 知识库问答 >
问题:

Java中的FunctionalInterface注释类型

崔宜修
2023-03-14

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

在文档中解释功能接口注释类型:

带有一个抽象方法声明的接口称为函数式interface.The编译器验证所有使用@FunctionalInterface注释的接口是否真正包含一个且仅包含一个抽象方法。如果使用此注释注释的接口不是函数式接口,则会生成编译时错误。在类、注释类型和枚举上使用此注释也是编译时错误。FunctionalInterface注释类型是标记接口。

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

// @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");
    }
}

共有2个答案

凌嘉志
2023-03-14

如果您遇到了这个问题,请先导入< code > Java . lang . functional interface 库,然后再像下面的示例那样放置< code>@FunctionInterface:

import java.lang.FunctionalInterface; 

@FunctionalInterface
public interface GreetingFunction {

    void sayMessage(String message);

}
阙繁
2023-03-14

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

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

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

 类似资料:
  • 在学习 Lambda 表达式时,我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。@FunctionalInterface 就是用来指定某个接口必须是函数式接口,所以 @FunInterface 只能修饰接口,不能修饰其它程序元素。 函数式接口就是为 Java 8 的 Lambda 表达式准备的,Java 8 允许使用 Lambda 表

  • 我正在使用注释处理器来处理方法参数的注释。 用于参数的注释类型有一个注释@参数 现在,当注释处理器运行时,我想检查参数注释()是否有参数注释。我通过执行以下代码来实现这一点。 由于某种原因,arg始终为空。是否有注释未返回的原因?

  • 本文向大家介绍Java注释的类型。,包括了Java注释的类型。的使用技巧和注意事项,需要的朋友参考一下 Java支持单行,多行注释和文档注释。Javadoc工具可以理解文档注释,并可用于创建基于HTML的文档。 / **被称为文档注释。Javadoc工具在为程序代码创建文档时使用它。 / *用于多行注释。 //用于单行注释 示例

  • 我有下面的课程。两个注释(AnnotA和AnnotB),一个类的子类。java'(带@AnnotA)及其“父”基。java'(带有@AnnotB)。 编译子对象时。java,我的注释处理器报告AnnotA,但它不报告在Base中找到的注释(AnnotB)。JAVA 安诺塔。JAVA 阿诺特。JAVA 基础JAVA 小孩JAVA MyProc。JAVA 这是编译过程及其输出,正如您所看到的,没有关于

  • 我在注释中创建一些元数据结构时遇到了问题。我们使用注释来定义Hibernate实体属性的特殊属性,但它可能在任何地方都可以使用。我想创建表示这些结构的条件: 问题是我需要使用此注释定义一些“树”结构。这是我想达到的一些设计: 我想根据这个例子使用的所有这些注释: 我知道我在上面的注释定义中定义的那种继承是不可能的。但是,我该如何考虑我的注释和,或是在一个“家庭”中?

  • 线程“main”java.lang.LinkageError:loader(sun/misc/launcher$AppClassLoader的实例):试图重复名称:“TestClass”的类定义 我正在尝试实现代理,如:easly-create-java-agents-with-bytebuddy中描述的示例所示 是否有一种方法可以加载Class对象而不导致此问题,或者使用传递给transform