2017-04-25 26 views
5

在Java 8中,引入@FunctionalInterface注释是为了表示具有一个抽象方法作为功能接口的任何接口。其引入的一个原因是向用户(程序员)表明,lambda表达式可以在功能接口的上下文中使用。当比较器有两个抽象方法时,它如何成为一个功能接口?

Comparator接口注有@FunctionalInterface。但是,两种方法是抽象的。

int compare(T o1, T o2); 

boolean equals(Object obj); 

FunctionalInterface的文档中,清楚地提及作为

在概念上,功能接口都只有一个抽象方法。

是不是equals方法在这里不被认为是抽象的?

+2

“概念上”可能是这里的关键词,与“实际上”截然不同。 – gyre

+2

'equals'从Object继承。 –

回答

14

该文档也状态:

如果接口声明了一个抽象方法覆盖的java.lang.Object公众的方法之一,也不会向接口的抽象方法计算,因为该接口的任何实施将有从java.lang.Object或其他地方执行。

而且,由于equals是这些方法之一中,接口的“抽象方法计数”仍为1

+1

回答我的问题。谢谢! – Arun

8
the FunctionalInterface documentation page

另外:

如果接口声明了一个抽象方法重写java.lang.Object之一的公共方法,即确实不是计数朝向界面的抽象会面因为接口的任何实现都将具有从java.lang.Object或其他地方的实现。 [重点矿]

由于equalsObject公开的方法,本声明适用;因此,对于Comparator只有compare方法有助于抽象方法计数。

本规则适用的其他值得注意的方法是toStringhashCode

+1

回答我的问题。谢谢! – Arun

+2

很高兴帮助!请让我知道如果你有任何问题:) – gyre