@FunctionalInterface是Java中显式声明函数式接口的注解,确保接口有且仅有一个抽象方法(default和static方法不计数),用于编译期校验和语义提示。

@FunctionalInterface 是 Java 中用于**显式声明函数式接口**的注解,它本身不改变接口行为,但起到编译期检查和语义提示的作用:确保该接口有且仅有一个抽象方法(default 方法和 static 方法不影响计数)。
什么是函数式接口?
函数式接口是指**只包含一个抽象方法**的接口(可以有多个 default 或 static 方法)。它是 Lambda 表达式和方法引用的类型基础。例如 Runnable、Comparator、Predicate 都是典型的函数式接口。
@FunctionalInterface 的作用和用法
加了这个注解后,编译器会强制校验——如果接口中定义了两个或以上抽象方法,就会报错。
- ✅ 正确:只有一个抽象方法 + 若干 default/static 方法 → 编译通过
- ❌ 错误:有两个抽象方法(如同时写两个未实现的方法)→ 编译失败,提示 “Unexpected @FunctionalInterface annotation”
- ⚠️ 注意:不加 @FunctionalInterface 也能当函数式接口用(只要满足“一个抽象方法”),但加了更安全、更清晰
如何自定义一个函数式接口?
下面是一个带参数和返回值的典型例子:
@FunctionalInterface
public interface Calculator {
// 唯一抽象方法(必须)
int compute(int a, int b);
<pre class="brush:php;toolbar:false;">// default 方法:不破坏函数式接口性质
default int add(int a, int b) {
return a + b;
}
// static 方法:也不影响
static int multiply(int a, int b) {
return a * b;
}}
使用时可配合 Lambda 表达式:
Calculator calc = (x, y) -> x * x + y; // 实现 compute 抽象方法 int result = calc.compute(3, 4); // 输出 13
常见误区提醒
- @FunctionalInterface 不能加在类、方法或抽象类上,只能用于接口
- Object 类中的 public 方法(如 toString()、equals()、hashCode())不算抽象方法,不会导致校验失败
- 继承已有函数式接口时要小心:若父接口已有一个抽象方法,子接口不能再声明新抽象方法,否则违反规则
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











