首页 > 解决方案 > 为什么当我们使用 super 时 Java 8 :: 运算符不适用于 Object hashcode 方法?

问题描述

下面的代码工作

Function fun1= super::equals
Function fun2= Object::hashCode 

但下面的代码不是

Function fun1= Object::equals
Function fun2= super::hashCode 

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

我在某处读过主要内容:

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

标签: javajava-8

解决方案


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

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

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

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

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

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

用于Object::equals和的正确功能接口类型super::hashCodeBiFunction<Object, Object, Boolean>IntSupplier

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


推荐阅读