【问题标题】:FuntionalInterface Annotation Type in JavaJava中的FunctionalInterface注解类型
【发布时间】:2015-04-29 21:18:52
【问题描述】:

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

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

具有一个抽象方法声明的接口称为 功能接口。编译器验证所有带注释的接口 使用@FunctionalInterface 接口真正包含一个和 只有一种抽象方法。如果 使用此注解注解的接口不起作用 接口。使用此注解也是编译时错误 类、注释类型和枚举。功能接口 annotation 类型是一个标记接口。

我做了一些测试,我不需要用这种注释类型标记我的接口。那么,我的问题是:如果每个接口都有一个方法,为什么我需要这个注解?

示例代码

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

【问题讨论】:

  • 您自己发布了答案:“编译器验证所有使用 @FunctionalInterface 注释的接口,这些接口确实包含一个且只有一个抽象方法。”
  • 但这是我的疑问?这个注释只是为了那个吗?
  • 是的。它确保它实际上是一个功能接口。

标签: java interface annotations


【解决方案1】:

您不必必须使用@FunctionalInterface 注释功能接口,但它记录了您创建一个接口的意图,并且如果接口不是功能接口(即只有一种非默认和非静态方法)。

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

另请参阅:Why isn't @FunctionalInterface used on all the interfaces in the JDK that qualify?

【讨论】:

  • 谢谢@assylias,但在你参考的最后陈述中,Holger 说:>这就像编译器处理它一样,你可以使用 lambda 表达式实现每个抽象方法接口,但是当存在注释,它将确保您可以以这种方式使用此接口。然后注释用于赋予编译器检查的责任。
  • 我还尝试向接口添加一个新方法并尝试使用 lambda 表达式来实现它,但我得到了编译错误:不是功能接口。而且我没有使用注释。
  • 你在这里混合了两件事。您需要将接口的提供者和用户分开。提供者(您)可以使用@FunctionalInterface 注释功能接口,在这种情况下,例如,如果它有两个抽象方法,您将收到编译错误。这是此注释的用途之一(除了文档)。如果接口不起作用,则 lambda 表达式中接口的 用户 (是否带注释)将收到编译错误 - 这与注释无关。
  • 换句话说,注释对提供者有利,因为如果接口不起作用,它将生成编译错误 - 它对用户有利,因为它记录了接口旨在用于 lambdas。
【解决方案2】:

如果您遇到此问题,请先导入java.lang.FunctionalInterfacelibrary,然后再放入@FunctionInterface,如下例所示:

import java.lang.FunctionalInterface; 

@FunctionalInterface
public interface GreetingFunction {

    void sayMessage(String message);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多