下面代码工作
Function fun1= super::equals
Function fun2= Object::hashCode 但是下面的代码不是
Function fun1= Object::equals
Function fun2= super::hashCode 这里的概念是什么,尽管它们都是对象类中的实例方法。
我在某个地方读到过校长:
发布于 2019-02-20 12:51:47
Function接口是一个函数接口,表示接受一个参数并返回值的函数。
super::equals之所以工作,是因为它是一个接受一个参数并返回值的函数。
Object::equals无法工作,因为它是一个接受两个参数并返回值的函数。
如果您有表单ClassName::instanceMethod的方法引用,它表示的函数将有一个额外的参数--调用该方法的对象。根据文档
方法引用
String::compareToIgnoreCase的等效lambda表达式将具有形式参数列表(String a, String b),其中a和b是用于更好地描述此示例的任意名称。方法引用将调用方法a.compareToIgnoreCase(b)
super::equals的形式是instance::instanceMethod,所以没有问题,并且按照您的预期工作。
用于Object::equals和super::hashCode的正确的函数接口类型是BiFunction<Object, Object, Boolean>和IntSupplier。
另外,不要使用原始类型。
发布于 2019-02-20 12:53:17
java.util.Function是一个采用一个参数的函数。
super::equals是一个使用一个参数(与super相比的对象)的函数,因此它可以工作。Object::equals是一个带有两个参数的函数:目标对象和要与之比较的对象,因此它无法工作。
类似地,Object::hashCode是一个参数的函数,但super::hashCode是一个零参数的函数。
发布于 2019-02-20 13:05:00
编写super::methodName时,在类的特定实例上创建方法引用。因此,函数接口的方法(指定此方法引用)必须期望与methodName相同数量的参数。
编写ClassName::methodName时,如果methodName不是静态方法,则在类的任意实例上创建方法引用。因此,函数接口的方法(指定此方法引用)必须期望与methodName具有+1的相同数量的参数(额外的参数是将在其上执行该方法的ClassName实例)。
Function接受一个参数并返回一个值。
因此,您可以为它分配一个特定实例的方法引用和一个参数方法(如super::equals中的),或者一个任意实例和一个0参数方法的方法引用(如在Object::hashCode中)。
但是,您不能为它分配任意实例的方法引用和单个参数方法(如Object::equals中的),因为这需要两个参数,而Function只需要一个参数。
由于需要两个参数,所以可以将此方法引用分配给BiFunction
BiFunction<Object,Object,Boolean> bifunc = Object::equals;类似地,您不能为它分配一个特定实例的方法引用和一个0参数方法(如在super::hashCode中),因为这需要0个参数,而Function需要一个参数。
由于需要0个参数,所以可以将此方法引用分配给Supplier
Supplier<Integer> sup = super::hashCode;https://stackoverflow.com/questions/54786667
复制相似问题