@FunctionalInterface 标识有且仅有一个抽象方法的接口,default、static、private 方法不破坏该约束;Comparator等官方接口即典型示例;但default方法不能覆盖Object的public方法。

@FunctionalInterface 是 Java 8 引入的注解,用于标识一个**函数式接口**——即**有且仅有一个抽象方法**的接口。它本身不改变接口行为,只起编译期检查作用:若被标注的接口抽象方法数量 ≠ 1,编译器会报错。
默认方法不影响函数式接口判定
Java 允许在接口中定义 default 方法(带方法体、可被实现类继承),它们不是抽象方法,因此不计入 @FunctionalInterface 要求的“唯一抽象方法”统计中。
- 只要接口中只有 1 个抽象方法(其他全是 default/static/私有方法),就满足函数式接口语义
- @FunctionalInterface 可以安全地与 default 方法共存,这是 Java 设计时明确支持的
- 例如:Comparator<T> 是官方函数式接口,但它定义了多个 default 方法(如
reversed()、thenComparing()),抽象方法只有compare(T, T)一个
静态方法和私有方法也兼容
同理,static 方法(属于接口本身)和 Java 9+ 支持的 private 方法(供 default 方法复用)均不构成抽象方法,不会破坏函数式接口契约。
- 可在函数式接口中用 private 方法封装公共逻辑,提升 default 方法可读性
- static 方法常用于提供工厂方法(如 Predicate.not())或工具组合(如 Function.identity())
注意:default 方法不能覆盖 Object 的 public 方法
虽然技术上允许在接口中声明与 Object 类同签名的 default 方法(如 toString()),但JVM 规定接口 default 方法无法真正覆盖 Object 方法。实现类调用时仍走 Object 默认行为,这容易引发误解。
- 不建议在函数式接口中定义
default toString()、default equals()等 - 若需定制行为,应在具体实现类中重写,而非依赖接口 default

















