JAVA8系列教程-Functional接口
温馨提示:
本文最后更新于 2019年12月14日,已超过 1,803 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我。
1.什么是Functional接口
功能接口是Java 8中的新增功能,它们在其中完全允许一种抽象方法。这些接口也称为单一抽象方法接口(Single Abstract Method interfaces :SAM接口)。
在Java 8中,功能接口也可以使用lambda表达式,方法引用和构造函数引用表示。
Java 8也引入了一个注解,即@FunctionalInterface,当您注解的接口违反了一种抽象方法的约定时,可将其用于编译器级错误。
让我们构建第一个功能接口:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); } |
让我们尝试添加另一个抽象方法:
@FunctionalInterface public interface MyFirstFunctionalInterface { public void firstWork(); public void doSomeMoreWork(); //error } |
以上将导致编译器错误,如下所示:
Unexpected @FunctionalInterface annotation @FunctionalInterface ^ MyFirstFunctionalInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFirstFunctionalInterface |
阅读更多:通用Functional接口
2.功能界面中的“应做”和“不应”
以下是功能界面中允许和不允许的事物的列表。
- 如上所述,在任何功能接口中仅允许使用一种抽象方法。在功能接口中不允许使用第二种抽象方法。如果我们删除@FunctionInterface批注,则可以添加另一个抽象方法,但是它将使接口成为非功能性接口。
- 即使
@FunctionalInterface
省略注释,功能接口也有效。它仅用于通知编译器在接口内部强制执行单个抽象方法。 - 从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。由于默认方法并不是抽象的,您可以自由地向您的功能接口添加默认方法。
以下是有效的功能接口:
@FunctionalInterface
public
interface
MyFirstFunctionalInterface
{
public
void
firstWork();
default
void
doSomeMoreWork1(){
//Method body
}
default
void
doSomeMoreWork2(){
//Method body
}
}
- 如果接口声明的抽象方法覆盖的公共方法之一
java.lang.Object
,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有java.lang.Object或其他地方的实现。例如,即使Comparator声明了两个抽象方法,它也是一个功能接口。为什么?因为这些抽象方法“equals()
”之一具有public
与Object
类中的方法相同的签名。例如,下面的接口是有效的功能接口。
@FunctionalInterface
public
interface
MyFirstFunctionalInterface
{
public
void
firstWork();
@Override
public
String toString();
//Overridden from Object class
@Override
public
boolean
equals(Object obj);
//Overridden from Object class
}
关于Java 8中的功能接口,到此为止。
正文到此结束
- 本文标签: 其他
- 本文链接: https://www.v8en.com/article/241
- 版权声明: 本文由SIMON原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权