@functionalinterface是java 8引入的编译期元注解,用于声明接口为函数式接口(有且仅有一个抽象方法),触发编译器强制校验:抽象方法数≠1即报错;default、static及object继承方法不计入;不加注解仍可被lambda使用,但失去契约保护与意图表达。

@FunctionalInterface 是 Java 8 引入的元注解,用于标识一个接口是函数式接口——即**有且仅有一个抽象方法**的接口。它本身不改变接口行为,但能触发编译器检查,防止意外添加多余抽象方法,从而保障该接口可用于 Lambda 表达式或方法引用。
编译期检查的具体作用
当你在接口上标注 @FunctionalInterface,编译器会严格验证:
- 接口中必须有且仅有一个抽象方法(默认方法、静态方法、Object 的 public 方法如 toString() 不计入)
- 若存在两个及以上抽象方法,编译直接报错:
Unexpected @FunctionalInterface annotation - 若没有抽象方法(空接口),同样报错
哪些方法不算“抽象方法”?
以下方法不会破坏函数式接口的合法性:
- default 方法(有具体实现)
- static 方法(属于接口本身,不参与实例调用)
- 从 Object 继承的 public 方法(如
equals()、hashCode()、toString()),即使没显式声明,也被视为已有实现
例如:即使你没写 equals(),编译器也知道它已存在,所以不会把它当作新增抽象方法计数。
正确使用示例
✅ 合法写法:
@FunctionalInterface
interface Calculator {
int apply(int a, int b); // 唯一抽象方法
default int add(int a, int b) { return a + b; } // default 方法不影响
static boolean isValid(int x) { return x > 0; } // static 方法也不影响
}
❌ 非法写法(编译失败):
@FunctionalInterface
interface BadExample {
void run();
void stop(); // 第二个抽象方法 → 编译错误
}
不加 @FunctionalInterface 会怎样?
不加注解,接口仍可作为函数式接口使用(只要满足“一个抽象方法”条件),但失去编译期防护。比如后期误加一个抽象方法,不会立即报错,可能导致 Lambda 处调用失败或语义混乱,问题延迟暴露。
加了注解,就是主动声明意图,并让编译器帮你守住契约。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











