首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java 8中“函数接口”的精确定义

Java 8中“函数接口”的精确定义
EN

Stack Overflow用户
提问于 2013-02-02 06:12:49
回答 8查看 8.8K关注 0票数 77

最近,我开始探索Java 8,我不太理解“函数接口”的概念,它是Java实现lambda表达式所必需的。在Java中有一个指向lambda函数的pretty comprehensive guide,但是我被the chapter that gives definition to the concept of functional interfaces卡住了。定义是这样的:

更准确地说,函数接口被定义为只有一个抽象方法的任何接口。

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

公共接口比较器{ int compare(T o1,T o2);boolean equals(Object obj);}

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

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2013-02-02 06:25:15

same page you linked to

接口比较器是功能性的,因为尽管它声明了两个抽象方法,但其中一个-equals-在Object中有一个对应于公共方法的签名。接口总是声明与Object的公共方法相对应的抽象方法,但它们通常隐式地这样做。无论是隐式声明还是显式声明,这些方法都会被排除在计数之外。

我真的不能说得更好了。

票数 70
EN

Stack Overflow用户

发布于 2016-02-23 17:54:49

@FunctionalInterface page中给出了另一种解释

从概念上讲,函数接口只有一个抽象方法。因为默认方法有一个实现,所以它们不是抽象的。如果接口声明了一个抽象方法,该抽象方法重写了java.lang.Object**,的公共方法之一,该方法也不计入接口的抽象方法计数,因为该接口的任何实现都将具有来自** java.lang.Object或其他地方的实现。

您可以使用@FunctionalInterface.测试哪个接口是正确的功能接口

例如:

  • 这是可行的

@FunctionalInterface公共接口FunctionalInterf { void m();boolean equals(Object o);}

  • 这会产生错误:

@函数接口公共接口FunctionalInterf { void m();boolean equals();}

在接口FunctionalInterf中找到多个非重写抽象方法

票数 14
EN

Stack Overflow用户

发布于 2016-02-20 19:10:35

但是在比较器接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象的方法。那么,如果定义要求一个接口恰好有一个抽象方法,那么这怎么可能呢?这里我漏掉了什么?

一个。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14655913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档