首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Java 8 ::操作符不工作对象哈希代码方法时,我们使用超级?

为什么Java 8 ::操作符不工作对象哈希代码方法时,我们使用超级?
EN

Stack Overflow用户
提问于 2019-02-20 12:43:17
回答 5查看 181关注 0票数 5

下面代码工作

代码语言:javascript
复制
Function fun1= super::equals
Function fun2= Object::hashCode 

但是下面的代码不是

代码语言:javascript
复制
Function fun1= Object::equals
Function fun2= super::hashCode 

这里的概念是什么,尽管它们都是对象类中的实例方法。

我在某个地方读到过校长:

  1. 对象::实例方法
  2. 类::静态方法
  3. 类::实例方法
EN

回答 5

Stack Overflow用户

发布于 2019-02-20 12:51:47

Function接口是一个函数接口,表示接受一个参数并返回值的函数。

super::equals之所以工作,是因为它是一个接受一个参数并返回值的函数。

Object::equals无法工作,因为它是一个接受两个参数并返回值的函数。

如果您有表单ClassName::instanceMethod的方法引用,它表示的函数将有一个额外的参数--调用该方法的对象。根据文档

方法引用String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(String a, String b),其中ab是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)

super::equals的形式是instance::instanceMethod,所以没有问题,并且按照您的预期工作。

用于Object::equalssuper::hashCode的正确的函数接口类型是BiFunction<Object, Object, Boolean>IntSupplier

另外,不要使用原始类型。

票数 11
EN

Stack Overflow用户

发布于 2019-02-20 12:53:17

java.util.Function是一个采用一个参数的函数。

super::equals是一个使用一个参数(与super相比的对象)的函数,因此它可以工作。Object::equals是一个带有两个参数的函数:目标对象和要与之比较的对象,因此它无法工作。

类似地,Object::hashCode是一个参数的函数,但super::hashCode是一个零参数的函数。

票数 3
EN

Stack Overflow用户

发布于 2019-02-20 13:05:00

编写super::methodName时,在类的特定实例上创建方法引用。因此,函数接口的方法(指定此方法引用)必须期望与methodName相同数量的参数。

编写ClassName::methodName时,如果methodName不是静态方法,则在类的任意实例上创建方法引用。因此,函数接口的方法(指定此方法引用)必须期望与methodName具有+1的相同数量的参数(额外的参数是将在其上执行该方法的ClassName实例)。

Function接受一个参数并返回一个值。

因此,您可以为它分配一个特定实例的方法引用和一个参数方法(如super::equals中的),或者一个任意实例和一个0参数方法的方法引用(如在Object::hashCode中)。

但是,您不能为它分配任意实例的方法引用和单个参数方法(如Object::equals中的),因为这需要两个参数,而Function只需要一个参数。

由于需要两个参数,所以可以将此方法引用分配给BiFunction

代码语言:javascript
复制
BiFunction<Object,Object,Boolean> bifunc = Object::equals;

类似地,您不能为它分配一个特定实例的方法引用和一个0参数方法(如在super::hashCode中),因为这需要0个参数,而Function需要一个参数。

由于需要0个参数,所以可以将此方法引用分配给Supplier

代码语言:javascript
复制
Supplier<Integer> sup = super::hashCode;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54786667

复制
相关文章

相似问题

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