4 回答
TA贡献1883条经验 获得超3个赞
Function接口是一个函数式接口,表示一个接受一个参数并返回一个值的函数。
super::equals之所以有效,是因为它是一个接受一个参数并返回一个值的函数。
Object::equals不起作用,因为它是一个接受两个参数并返回一个值的函数。
如果您有 form 的方法引用,ClassName::instanceMethod则它表示的函数将有一个额外的参数 - 调用该方法的对象。根据文档:
方法引用的等效 lambda 表达式
String::compareToIgnoreCase将具有形式参数 list(String a, String b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用该方法a.compareToIgnoreCase(b)
super::equals是形式instance::instanceMethod,所以没有问题并且可以按您的预期工作。
用于Object::equals和的正确功能接口类型super::hashCode是BiFunction<Object, Object, Boolean>和IntSupplier。
另外,不要使用原始类型。
TA贡献1852条经验 获得超1个赞
java.util.Function是一个接受一个参数的函数。
super::equals是一个接受一个参数(super与之比较的对象)的函数,因此它可以工作。Object::equals是一个接受两个参数的函数:目标对象和要比较的对象,因此它不起作用。
同样,Object::hashCode是一个参数的函数,但是super::hashCode是零参数的函数。
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;
添加回答
举报
