为什么方法引用与带有不同数量args的功能接口兼容?

Xin*_*Yao 2 java java-8 functional-interface method-reference

我了解,如果所引用的方法与功能接口具有相同数量的args并返回相同的类型,则可以使用方法引用来实现功能接口,但是为什么在某些情况下,所引用的方法与功能接口具有不同数量的args但仍然兼容吗?

我有一个简单的BiConsumer,我尝试使用方法引用来实现它。我知道只要args的数量匹配,我也可以使用lambda表达式。我将显示代码以清楚地说明它。

我有一个BiConsumer<ArrayList<String>, ? super String>我要实现的。

Lambda表达式的实现方式是:

BiConsumer<ArrayList<String>, ? super String> b = (firstArg,secondArg) -> firstArg.add(secondArg); 由于它们都带有2个输入参数,因此没有问题。

但是为什么BiConsumer<ArrayList<String>, ? super String> a = ArrayList::add;也兼容?addArrayList上的方法仅需要1个输入args,而功能接口则需要2个。

任何答案将不胜感激。谢谢!

And*_*lko 7

15.12.2.1。确定潜在的适用方法

一种方法,参照表达式(§15.13)是具有官能接口类型潜在兼容T如果,其中函数类型的元数的Tn,存在的至少一种可能适用的方法时所述方法参考表达靶向功能类型与元数n(§15.13 .1),并且满足以下条件之一:

  • 方法参考表达式具有以下形式ReferenceType :: [TypeArguments] Identifier,并且至少一种可能适用的方法是(i)静态并支持arity n或(ii)不是静态并支持arityn-1

您要使用的函数类型具有偶数2

void accept(T t, U u);
Run Code Online (Sandbox Code Playgroud)

并且该方法ArrayList::add所指的是arity 1,并且它不是静态的。它使其潜在地适用。


khe*_*ood 6

第一个参数是要调用的ArrayList add

在这种情况下,

ArrayList::add
Run Code Online (Sandbox Code Playgroud)

手段

(list, obj) -> list.add(obj)
Run Code Online (Sandbox Code Playgroud)

这是一个BiConsumer。