Java函数式接口中的抽象方法个数怎么计算?为什么Comparator接口中有两个抽象方法,依旧是函数式接口?

什么是接口

熟悉Java的人一定对接口(interface)不陌生。简单来说,接口就是只含抽象方法 的"类"(使用关键字------interface声明)。其实这也是十分不准确的,因为很多开发中使用的JDK(如JDK8及以上版本)定义的接口除了有抽象方法,还有默认方法 (使用default修饰的方法,其方法含有方法体),甚至可以有字段(或成员变量,不允许使用private、protected修饰)。

综上,接口只能含有:

  1. 抽象方法------没有方法体(空语句也不允许 ,类似C/C++的方法声明),且修饰符不能为public和protected。
  2. 默认方法------这是包含方法体的普通方法,但要在方法返回类型前使用关键字default修饰。
  3. 字段(成员变量)。

什么是函数式接口

函数式接口从形式上看就是只含有一个抽象方法的接口。

  • 接口中的默认方法不影响接口成为函数式接口。也就是说,只要接口仅包含一个抽象方法,不管接口中有没有默认方法、有几个默认方法,该接口就是函数式接口。
  • 可以为接口增加注解------@FunctionalInterface,以便编译器强制检查该接口是否满足函数式接口的限制------仅包含一个抽象方法。

函数式接口中的抽象方法个数的计算

那么对于复杂的接口,比如接口A继承了接口B,甚至还继承了接口C,那么接口A还可以成为函数式接口吗?

  • 子接口若将父接口中的抽象方法重写为默认方法,则子接口的抽象方法个数将减少一。
  • 子接口若将父接口中的默认方法重新声明为抽象方法,则子接口的抽象方法个数将增加一。

可见接口A还是有可能成为函数式接口的,虽然这可能在接口的设计上不符合初衷。

JDK中提供的Comparator接口使用@FunctionalInterface修饰,但却含有两个抽象方法,这和前述矛盾了?

我在翻阅Comparator接口的源码时,发现它是函数式接口(使用@FunctionalInterface注解修饰),但它有两个抽象方法:

java 复制代码
int compare(T o1, T o2);
boolean equals(Object obj);

这和上面介绍的内容矛盾了?是我们错了,还是JDK错了?
显然地 ,JDK不可能有错,我们也没有错。这是因为关于抽象方法个数的计算还有一个重点:
接口若将父类(因为接口只能继承接口而不能继承类,所以这指的是接口隐式继承了根类Object)中的方法重新声明为了抽象方法,并不影响该接口的抽象方法个数。

其实注解@FunctionalInterface的文档说明也强调了这点:
Conceptually, a functional interface has exactly one abstract method. Since default methods have an implementation, they are not abstract. If an interface declares an abstract method overriding one of the public methods of java.lang.Object, that also does not count toward the interface's abstract method count since any implementation of the interface will have an implementation from java.lang.Object or elsewhere.

相关推荐
leikooo6 小时前
用餐厅和盘子理解栈和堆
java·数据结构·链表·rust
Ivanqhz8 小时前
激活函数在 Transformer 中的作用及各种变体简述
java·linux·数据库·人工智能·深度学习
沙漠之主8 小时前
C++编程教学设计资料:从入门到实战的完整课程方案
java·前端·c++
FPGA小徐8 小时前
PA1 基础设施(2)深度解析:NEMU 中 ITRACE、MTRACE、FTRACE、IRINGBUF、ETRACE、DIFFTEST 全解析
java·服务器·网络
YOLO数据集集合9 小时前
EvoAgent:面向PR研发治理的自进化Multi-Agent Harness系统
java·开发语言·目标检测·agent·自进化
知行EDI9 小时前
知行之桥 MaBang 端口使用指南——Create Order 订单创建篇
java·服务器·数据库
笑鸿的学习笔记9 小时前
C++笔记之大块顺序写
java·c++·笔记
打工仔折腾 AI9 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
殷色玫瑰10 小时前
C/C++ 内存管理详解:从内存分布到 new/delete 底层原理
java·linux·c语言·c++
青山木12 小时前
Hot 100 --- 编辑距离
java·数据结构·算法·leetcode·动态规划