为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-11-18 12:44:19
最近,我开始探索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方法都是抽象的,这意味着它具有两个抽象方法。那么,如果定义要求一个接口仅具有一个抽象方法,那么这将如何工作?我在这里想念什么?
查看完整描述

3 回答

?
开心每一天1111

TA贡献1836条经验 获得超12个赞

在同一页面上,您链接到:


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


我真的不能说得更好。


查看完整回答
反对 回复 2019-11-18
?
湖上湖

TA贡献2003条经验 获得超2个赞

从概念上讲,功能接口仅具有一种抽象方法。由于默认方法具有实现,因此它们不是抽象的。如果接口声明的抽象方法覆盖的公共方法之一java.lang.Object,则该方法也不会计入接口的抽象方法计数,因为该接口的任何实现都将具有来自java.lang.Object其他地方的实现。


您可以测试它的接口是一个正确的功能接口使用 @FunctionalInterface。


例如:


这有效


@FunctionalInterface

public interface FunctionalInterf {


    void m();


    boolean equals(Object o);


}

这会产生一个错误:


@FunctionalInterface

public interface FunctionalInterf {


    void m();


    boolean equals();


}

接口FunctionalInterf中提供的多个非覆盖抽象方法


查看完整回答
反对 回复 2019-11-18
  • 3 回答
  • 0 关注
  • 326 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信