首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Java 8中使用@FunctionalInterface注释

为什么在Java 8中使用@FunctionalInterface注释
EN

Stack Overflow用户
提问于 2018-06-17 06:00:39
回答 3查看 5.9K关注 0票数 9

如果我们的Interface中只有一个抽象方法,那么默认情况下它就是Functional Interface。谁能解释一下@FunctionalInterface注释带来的额外好处?

我知道如果我们添加@FunctionalAnnotation,它将不允许别人在接口中添加另一个抽象方法,因为它会给出编译错误,但我的观点是,即使你不使用@FucntionalInterface注释,那么,如果有人添加另一个抽象方法,它将破坏代码中所有现有的lambda表达式,编译器会抱怨。

例如:

如果我有以下接口:

代码语言:javascript
复制
public interface User {

    Integer fetchData(Integer userId);
}

具体实现如下:

代码语言:javascript
复制
public class UserImpl implements User{

    @Override
    public Integer fetchData(Integer userId) {
        return 1;
    }
}

和以下用法:

公共类TestFunctionalInterface {

代码语言:javascript
复制
public static void main(String[] args) {
    User user = a -> a*2;
    System.out.println("FetchedData:"+user.fetchData(2));
}

}

现在,如果我尝试在接口中添加另一个方法,如下所示:

代码语言:javascript
复制
public interface User {

    Integer fetchData(Integer userId);

    Integer fetchLoginDetails(Integer userId);

}

编译器在以下代码中出现错误:

代码语言:javascript
复制
public class TestFunctionalInterface {

    public static void main(String[] args) {
        User user = a -> a*2;
        System.out.println("FetchedData:"+user.fetchData(2));
    }

}

在行User =a -> a*2;

消息“此表达式的目标类型必须是函数接口”。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-17 06:13:13

通过@functionalInterface保护你的接口的主要优点是当你使用lambda来实例化它们时。

Lambda声明只能声明一个代码块,所以如果你的接口上没有保护,并且一些人会添加抽象方法,那么你的lambda就没有更多的意义了……

这就是为什么强烈建议不要使用lambda实现某些隐式函数接口。

因此,如果您想通过lambda方式实现此接口,我鼓励您添加作为安全性的注释。如果您不想要这种实现,或者如果您的接口将发生变化,或者可能会发生变化,那么就不要这样做。

票数 2
EN

Stack Overflow用户

发布于 2018-06-17 06:10:34

函数接口只能有一个抽象方法。如果你有两个抽象方法,那么你的接口就不再起作用了。

如果你有一个抽象的方法,你可以使用lambda表达式。

如果您看到@FunctionalInterface注释,您就知道不应该添加任何新方法,因为它会破坏设计。

如果您向任何java接口添加新的抽象方法,它无论如何都会破坏代码,因为您需要提供具体类的实现。

票数 6
EN

Stack Overflow用户

发布于 2018-06-17 06:05:34

如果另一个模块正在使用该接口,则不会发生编译错误,例如,如果该接口通过依赖项可用。使用你的模块的人可以安全地使用lambda中的函数,而不用担心以后的更新会破坏他们的代码。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50892117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档