Java 8中“functional interface”的精确定义

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

最近我开始探索Java 8,并且我不太理解Java实现lambda表达式所必需的“函数接口”的概念。Java中有一个非常全面的 lambda函数指南,但是我陷入了定义函数接口概念的章节中。定义如下:

更确切地说,一个功能接口被定义为只有一个抽象方法的任何接口。

然后他继续进行示例,其中之一是Comparator界面:

public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }

我能够测试我可以使用lambda函数代替Comparator参数,它可以工作(ie Collections.sort(list, (a, b) -> a-b))。

但在比较这两种接口compareequals方法都是抽象的,这意味着它有两个抽象方法。那么如果这个定义需要一个接口只有一个抽象方法,那么这怎么能起作用呢?我在这里错过了什么?

提问于
用户回答回答于

从您链接到的同一页面:

接口Comparator是可用的,因为尽管它声明了两个抽象方法,其中一个equals方法具有与Object中的公共方法相对应的签名。接口总是声明与Object的公共方法相对应的抽象方法,但他们通常隐式地这样做。无论是隐式还是明确声明,这些方法都不包括在计数中。

用户回答回答于

问:但在比较器接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象方法。那么如果这个定义需要一个接口只有一个抽象方法,那么这怎么能起作用呢?我在这里错过了什么?

功能接口可以指定由Object定义的任何公共方法,如equals(),而不会影响其“功能接口”状态。公共对象方法被认为是一个功能接口的隐式成员,因为它们是由一个功能接口的实例自动实现的。

扫码关注云+社区