Java 8中“功能接口”的精确定义

最近,我开始探索Java 8,但我不太了解“功能接口”的概念,该概念对于Java的lambda表达式实现至关重要。Java中有关于lambda函数的相当全面的指南,但是我陷入了为功能接口的概念定义的章节中。定义如下:


更准确地说,功能接口定义为具有一种抽象方法的任何接口。


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


public interface Comparator<T> {

    int compare(T o1, T o2);

    boolean equals(Object obj);

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


但是在Comparator界面中,compare和equals方法都是抽象的,这意味着它具有两个抽象方法。那么,如果定义要求一个接口仅具有一个抽象方法,那么这将如何工作?我在这里想念什么?


杨__羊羊
浏览 329回答 3
3回答

开心每一天1111

在同一页面上,您链接到:接口Comparator之所以有用,是因为尽管它声明了两个抽象方法,但其中一个(等于)具有与Object中的公共方法相对应的签名。接口总是声明与Object的公共方法相对应的抽象方法,但是它们通常是隐式的。无论是隐式还是显式声明,此类方法均不包括在内。我真的不能说得更好。

湖上湖

从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果接口声明的抽象方法覆盖的公共方法之一java.lang.Object,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自java.lang.Object其他地方的实现。您可以测试它的接口是一个正确的功能接口使用 @FunctionalInterface。例如:这有效@FunctionalInterfacepublic interface FunctionalInterf {&nbsp; &nbsp; void m();&nbsp; &nbsp; boolean equals(Object o);}这会产生一个错误:@FunctionalInterfacepublic interface FunctionalInterf {&nbsp; &nbsp; void m();&nbsp; &nbsp; boolean equals();}接口FunctionalInterf中提供的多个非覆盖抽象方法
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java