@FunctionalInterface注解是编译期强制校验工具,确保接口有且仅有一个抽象方法;默认方法、静态方法及Object继承的public方法不计入抽象方法数。

用 @FunctionalInterface 注解就能直接验证一个接口是否严格满足“单抽象方法”这一函数式接口核心要求。
注解本身是编译期校验工具
它不是装饰用的标签,而是编译器的强制检查开关。只要在接口声明前加上这个注解,Java 编译器就会立刻执行两项关键检查:
- 抽象方法数量是否恰好为 1(多于或少于都不行)
- 所有方法是否符合接口语义(比如不能出现 private 抽象方法、不能有构造器等)
一旦不满足,编译失败并报错,例如:Error: Invalid @FunctionalInterface annotation; MyInterface is not a functional interface。
哪些方法不计入“抽象方法”计数
以下三类方法存在不影响单抽象方法判定,无需额外处理,也不触发编译错误:
- 默认方法(
default修饰,有方法体) - 静态方法(
static修饰,有方法体) - 从
Object继承的公开方法(如toString()、equals(Object)、hashCode()),即使没显式写出,也自动视为已有且不计数
正确写法示例(带校验效果)
下面这个接口加了注解,编译能过,说明它通过了全部校验:
@FunctionalInterface
interface DataProcessor {
String process(String input); // ✅ 唯一抽象方法
default boolean isValid(String s) { return s != null; } // 允许
static void log(String msg) { System.out.println(msg); } // 允许
// 没写 toString(),但隐含存在,也不影响
}
常见误用与即时反馈
如果误加了第二个抽象方法,比如:
@FunctionalInterface
interface BadExample {
void run();
void stop(); // ❌ 编译器立刻报错:Multiple non-overriding abstract methods
}
或者漏写抽象方法:
@FunctionalInterface
interface EmptyInterface {
default void doNothing() {}
} // ❌ 编译器报错:No abstract method found
这些都不是运行时异常,而是在保存或构建时就拦截,真正实现“红线即刻可见”。

















