猿问

为什么当我们使用 super 时 Java 8 :: 运算符不适用于

下面的代码工作


Function fun1= super::equals

Function fun2= Object::hashCode 

但下面的代码不是


Function fun1= Object::equals

Function fun2= super::hashCode 

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


我在某处读过主要内容:


对象::实例方法

类::静态方法

类::实例方法



跃然一笑
浏览 212回答 4
4回答

白板的微信

Function接口是一个函数式接口,表示一个接受一个参数并返回一个值的函数。super::equals之所以有效,是因为它是一个接受一个参数并返回一个值的函数。Object::equals不起作用,因为它是一个接受两个参数并返回一个值的函数。如果您有 form 的方法引用,ClassName::instanceMethod则它表示的函数将有一个额外的参数 - 调用该方法的对象。根据文档:方法引用的等效 lambda 表达式String::compareToIgnoreCase将具有形式参数 list&nbsp;(String a, String b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用该方法a.compareToIgnoreCase(b)super::equals是形式instance::instanceMethod,所以没有问题并且可以按您的预期工作。用于Object::equals和的正确功能接口类型super::hashCode是BiFunction<Object, Object, Boolean>和IntSupplier。另外,不要使用原始类型。

小怪兽爱吃肉

java.util.Function是一个接受一个参数的函数。super::equals是一个接受一个参数(super与之比较的对象)的函数,因此它可以工作。Object::equals是一个接受两个参数的函数:目标对象和要比较的对象,因此它不起作用。同样,Object::hashCode是一个参数的函数,但是super::hashCode是零参数的函数。

绝地无双

当您编写 时super::methodName,您正在为类的特定实例创建方法引用。因此,功能接口的方法(您分配此方法引用)必须期望与具有相同数量的参数methodName。当您编写ClassName::methodName, ifmethodName不是静态方法时,您是在类的任意实例上创建方法引用。因此,功能接口的方法(您分配此方法引用)必须期望与 has + 1 相同数量的参数methodName(额外的参数是将在其上执行方法的 ClassName 的实例)。Function接受一个参数并返回一个值。因此,您可以为其分配特定实例的方法引用和单个参数方法(如 中super::equals)或任意实例的方法引用和 0 参数方法(如中Object::hashCode)。但是,您不能为它分配任意实例的方法引用和单个参数方法(如 中Object::equals),因为这需要两个参数,并且Function只需要一个参数。由于需要两个参数,因此您可以将此方法引用分配给 a&nbsp;BiFunction:BiFunction<Object,Object,Boolean>&nbsp;bifunc&nbsp;=&nbsp;Object::equals;同样,您不能为其分配特定实例的方法引用和 0 参数方法(如 中super::hashCode),因为这需要 0 个参数,并且Function需要一个。由于需要 0 个参数,因此您可以将此方法引用分配给 a&nbsp;Supplier:Supplier<Integer>&nbsp;sup&nbsp;=&nbsp;super::hashCode;

三国纷争

hashCode 不是函数。它是一个供应商。Supplier&nbsp;fun2&nbsp;=&nbsp;super::hashCode;
随时随地看视频慕课网APP

相关分类

Java
我要回答