在Java8中,引入了@FunctionalInterface
注释来表示任何只有一个抽象方法作为函数接口的接口。引入它的原因之一是指示用户(程序员),lambda表达式可以在函数接口的上下文中使用。
比较器
接口用@FunctionalInterface
注释。但是,两种方法是抽象的。
int compare(T o1, T o2);
和
boolean equals(Object obj);
在FunctionInterface的文档中,明确提到
从概念上讲,函数接口只有一个抽象方法。
equals
方法在这里不是被认为是抽象的吗?
也可以从“功能界面”文档页:
如果接口声明了一个抽象方法,该方法重写了java的一个公共方法。lang.Object,这也不计入接口的抽象方法计数,因为接口的任何实现都将有来自java的实现。lang.Object或其他位置。[强调我的]
由于equals
是Object
的公共方法,因此适用此语句;因此,对于比较器
,只有比较
方法有助于抽象方法计数。
此规则适用的其他值得注意的方法有toString和hashCode。
文件还指出:
如果接口声明了一个抽象方法,该方法重写了java的一个公共方法。lang.Object,这也不计入接口的抽象方法计数,因为接口的任何实现都将有来自java的实现。lang.Object或其他位置。
由于equals
是这些方法之一,因此接口的“抽象方法计数”仍然为1。
问题内容: 学习Java 8 Lambda,只是想知道编译器如何知道Comparator中的哪种方法用于lambda表达式?它似乎不是SAM接口?它有2种抽象方法: 问题答案: 不是抽象方法。此方法重写,并且仅使Comparator接口能够将javadoc附加到该方法,解释了比较器应如何实现。 参见FunctionalInterface的javadoc: 如果接口声明的抽象方法覆盖了java.la
但是为什么一个函数接口应该只有一个抽象方法呢?如果接口有多个抽象方法,为什么这不是函数接口?
但是,这两种方法都不返回真值。我已经检查了每个属性,它们都匹配。 如何比较这两个对象以验证它们是相同的?
最近,我开始了一个新的项目,其中具有单个抽象方法的所有接口都用来代替。我经常看到有人在界面中添加另一个抽象方法后删除注释。我什么时候问过为什么?他们告诉我,公司里有个不在的人让他们那样做。现在我不确定对显然不会与lambdas一起使用的接口进行注释是不是一个好主意。 现在我看到了一个有用的信息,就是人们甚至在服务中也在使用anotation。我就像一个代码:
问题内容: 我有两个从同一类实例化的java对象。 如果我将它们的两个属性都设置为完全相同的值,然后验证它们是否相同 但是,这些方法都不返回真实值。我已经检查了每个属性,并且它们匹配。 如何比较这两个对象以验证它们是否相同? 问题答案: 你需要提供自己的实现。 如果哈希表中有可能使用你的对象,则还应该重写。一个合理的实施将是该对象的字段的哈希码喜欢的东西结合起来:
我想制作一个实现比较器接口的比较器类。在类中,我想根据它们的ID比较我的2个员工对象。到目前为止,我制作的员工类是: 我完全被困住了,不知道该怎么办。有人能帮忙吗?