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

时间:2019-09-06 21:45:43

标签: java java-8 method-reference functional-interface

我了解,如果所引用的方法与功能接口使用相同数量的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;也兼容? ArrayList上的add方法仅需要1个输入args,而功能接口则需要2个。

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

2 个答案:

答案 0 :(得分:7)

  

15.12.2.1. Identify Potentially Applicable Methods

     

如果函数引用类型为T的地方为T,则方法引用表达式(第15.13节)可能与功能接口类型n兼容当方法引用表达式以Arity n(第15.13.1节)为目标的函数类型作为目标时,一种可能适用的方法,并且下列条件之一为真:

     
      
  • 方法引用表达式的形式为ReferenceType :: [TypeArguments] Identifier,并且至少一个可能适用的方法是(i)静态并支持arity n或(ii)不是静态并支持arity { {1}}
  •   

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

n-1

并且方法void accept(T t, U u); 所引用的方法具有Arity 1,并且它不是静态的。这使其有可能适用。

答案 1 :(得分:6)

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

在这种情况下,

ArrayList::add

表示

(list, obj) -> list.add(obj)

是BiConsumer。