最近,我开始探索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)
)。
但是在比较器接口中,compare
和equals
方法都是抽象的,这意味着它有两个抽象方法。那么,如果定义要求接口只有一个抽象方法,这怎么能起作用呢?这里我漏掉了什么?
发布于 2013-02-02 06:25:15
接口比较器是功能性的,因为尽管它声明了两个抽象方法,但其中一个-equals-在Object中有一个对应于公共方法的签名。接口总是声明与Object的公共方法相对应的抽象方法,但它们通常隐式地这样做。无论是隐式声明还是显式声明,这些方法都会被排除在计数之外。
我真的不能说得更好了。
发布于 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中找到多个非重写抽象方法
发布于 2016-02-20 19:10:35
但是在比较器接口中,compare()和equals()方法都是抽象的,这意味着它有两个抽象的方法。那么,如果定义要求一个接口恰好有一个抽象方法,那么这怎么可能呢?这里我漏掉了什么?
一个。
函数接口可以指定Object定义的任何公共方法,例如equals( ),而不会影响其“函数接口”状态。公共对象方法被视为函数接口的隐式成员,因为它们是由函数接口的实例自动实现的。
https://stackoverflow.com/questions/14655913
复制相似问题