为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

跃然一笑 2022-06-30 10:56:22
下面的代码工作Function fun1= super::equalsFunction fun2= Object::hashCode 但下面的代码不是Function fun1= Object::equalsFunction fun2= super::hashCode 即使都是 Object 类中的实例方法,这里的概念是什么。我在某处读过主要内容:对象::实例方法类::静态方法类::实例方法
查看完整描述

4 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

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

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


查看完整回答
反对 回复 2022-06-30
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

java.util.Function是一个接受一个参数的函数。

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

同样,Object::hashCode是一个参数的函数,但是super::hashCode参数的函数。


查看完整回答
反对 回复 2022-06-30
?
绝地无双

TA贡献1946条经验 获得超4个赞

当您编写 时super::methodName,您正在为类的特定实例创建方法引用。因此,功能接口的方法(您分配此方法引用)必须期望与具有相同数量的参数methodName

当您编写ClassName::methodName, ifmethodName不是静态方法时,您是在类的任意实例上创建方法引用。因此,功能接口的方法(您分配此方法引用)必须期望与 has + 1 相同数量的参数methodName(额外的参数是将在其上执行方法的 ClassName 的实例)。

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

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

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

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

BiFunction<Object,Object,Boolean> bifunc = Object::equals;

同样,您不能为其分配特定实例的方法引用和 0 参数方法(如 中super::hashCode),因为这需要 0 个参数,并且Function需要一个。

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

Supplier<Integer> sup = super::hashCode;


查看完整回答
反对 回复 2022-06-30
?
三国纷争

TA贡献1804条经验 获得超7个赞

hashCode 不是函数。它是一个供应商。

Supplier fun2 = super::hashCode;


查看完整回答
反对 回复 2022-06-30
  • 4 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号