【发布时间】:2018-06-16 22:00:39
【问题描述】:
如果我们的接口中只有一个抽象方法,则默认为函数式接口。谁能解释一下@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));
}
}
在行用户用户 = a -> a*2;
带有消息“此表达式的目标类型必须是函数 界面”。
【问题讨论】:
-
除非您的编译单元中没有该类型的任何 lambda。它也可用作文档。并且某些 SAM 接口不旨在定义为 lambda 表达式。见stackoverflow.com/questions/28166187/…
-
@JB Nizet,感谢您的回复。如果我的编译单元中没有任何 lambda,即使在这种情况下,如果我在接口中添加另一个抽象方法,我应该很确保所有要实现这个接口的类都会失败,因为它们需要实现这个新方法。
-
除非您在编译单元中没有此接口的任何具体实现。您可能会编写一个库,定义一个接口,但不自己实现它。同样,它还用于记录该接口被设计为实现为 lambda 表达式。
标签: java-8 functional-interface