我们常用的一些接口Callable、Runnable、Comparator等在JDK8中都添加了@FunctionalInterface注解。
Java 8 专门为函数式接口提供了@FunctionalInterface注解,该注解通常放在接口定义前面,对程序功能没有任何作用,它用于告诉编译器执行更严格的检查——检查该连接口必须是函数式接口,否则编译器就会报错。
Lambda表达式的目标类型必须是“函数式接口(functional interface)”。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

特点:

1、该注解只能标记在”有且仅有一个抽象方法”的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法,例如toString(),equals()方法。
4、该注解不是必须的,如果一个接口符合”函数式接口”定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。
@FunctionalInterface标记在接口上,“函数式接口”是指仅仅只包含一个抽象方法的接口

举例:

如果一个接口中包含不止一个抽象方法,那么不能使用@FunctionalInterface,编译会报错。
函数式接口@FunctionalInterface - 图1
比如下面这个接口就是一个正确的函数式接口:(下面例子中equals和toString都属于Object里的方法,任何被java.lang.Object实现的方法,都不能视为抽象方法

  1. // 正确的函数式接口
  2. @FunctionalInterface
  3. public interface TestInterface {
  4. // 抽象方法
  5. public void sub();
  6. // java.lang.Object中的方法不是抽象方法
  7. public boolean equals(Object var1);
  8. public String toString();
  9. // default不是抽象方法
  10. public default void defaultMethod(){
  11. }
  12. // static不是抽象方法
  13. public static void staticMethod(){
  14. }
  15. }