当我们使用super时,为什么Java 8 :: operator不能用于Object hashcode方法?

Bal*_*oud 5 java java-8

下面代码工作

Function fun1= super::equals
Function fun2= Object::hashCode 
Run Code Online (Sandbox Code Playgroud)

但是下面的代码不是

Function fun1= Object::equals
Function fun2= super::hashCode 
Run Code Online (Sandbox Code Playgroud)

这里的概念是什么,即使所有都是Object类中的实例方法.

我在某处读过校长:

  1. object :: instance方法
  2. Class :: static方法
  3. Class :: instance方法

Swe*_*per 11

Function接口是表示接受一个参数并返回一个值的功能的功能的接口.

super::equals 因为它是一个接受一个参数并返回一个值的函数.

Object::equals不起作用,因为它是一个接受两个参数并返回值的函数.

如果你有一个表单的方法引用ClassName::instanceMethod,它所代表的函数将有一个额外的参数 - 调用该方法的对象.根据文件:

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

super::equalsinstance::instanceMethod这样的形式所以没有问题,并按预期工作.

正确功能的接口类型,使用Object::equalssuper::hashCodeBiFunction<Object, Object, Boolean>IntSupplier.

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

  • 我是否正确理解`函数fun2 = Object :: hashCode;`编译,因为它将当前实例作为函数的参数部分,但不将其传递给`hashCode`而是在实例上调用该方法? (2认同)
  • @Tom是的,请参阅引用的文档. (2认同)
  • @Tom是的,该实例不作为参数传递,而是用作应用该方法的实例. (2认同)