如果我们的Interface中只有一个抽象方法,那么默认情况下它就是Functional Interface。谁能解释一下@FunctionalInterface注释带来的额外好处?
我知道如果我们添加@FunctionalAnnotation,它将不允许别人在接口中添加另一个抽象方法,因为它会给出编译错误,但我的观点是,即使你不使用@FucntionalInterface注释,那么,如果有人添加另一个抽象方法,它将破坏代码中所有现有的lambda表达式,编译器会抱怨。
例如:
如果我有以下接口:
public interface User {
Integer fetchData(Integer userId);
}
具体实现如下:
public class UserImpl implements User{
@Override
public Integer fetchData(Integer userId) {
return 1;
}
}
和以下用法:
公共类TestFunctionalInterface {
public static void main(String[] args) {
User user = a -> a*2;
System.out.println("FetchedData:"+user.fetchData(2));
}
}
现在,如果我尝试在接口中添加另一个方法,如下所示:
public interface User {
Integer fetchData(Integer userId);
Integer fetchLoginDetails(Integer userId);
}
编译器在以下代码中出现错误:
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;
消息“此表达式的目标类型必须是函数接口”。
发布于 2018-06-17 06:13:13
通过@functionalInterface保护你的接口的主要优点是当你使用lambda来实例化它们时。
Lambda声明只能声明一个代码块,所以如果你的接口上没有保护,并且一些人会添加抽象方法,那么你的lambda就没有更多的意义了……
这就是为什么强烈建议不要使用lambda实现某些隐式函数接口。
因此,如果您想通过lambda方式实现此接口,我鼓励您添加作为安全性的注释。如果您不想要这种实现,或者如果您的接口将发生变化,或者可能会发生变化,那么就不要这样做。
发布于 2018-06-17 06:10:34
函数接口只能有一个抽象方法。如果你有两个抽象方法,那么你的接口就不再起作用了。
如果你有一个抽象的方法,你可以使用lambda表达式。
如果您看到@FunctionalInterface注释,您就知道不应该添加任何新方法,因为它会破坏设计。
如果您向任何java接口添加新的抽象方法,它无论如何都会破坏代码,因为您需要提供具体类的实现。
发布于 2018-06-17 06:05:34
如果另一个模块正在使用该接口,则不会发生编译错误,例如,如果该接口通过依赖项可用。使用你的模块的人可以安全地使用lambda中的函数,而不用担心以后的更新会破坏他们的代码。
https://stackoverflow.com/questions/50892117
复制相似问题