为什么方法引用与参数数量不同的功能接口兼容?
Why Method reference is compatible to a functional interface with difference number of args?
我知道如果引用的方法采用与功能接口相同数量的参数并且return相同的类型,则方法引用可以用于实现功能接口,但为什么在某些情况下引用的方法参数数量与功能接口不同,但仍然兼容?
我有一个简单的 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 个输入参数,但功能接口需要 2 个。
任何答案将不胜感激。谢谢!
第一个参数是要在 add
上调用的 ArrayList。
在这种情况下,
ArrayList::add
表示
(list, obj) -> list.add(obj)
这是一个 BiConsumer。
15.12.2.1. Identify Potentially Applicable Methods
A method reference expression (§15.13) is potentially compatible with a functional interface type T
if, where the arity of the function type of T
is n
, there exists at least one potentially applicable method when the method reference expression targets the function type with arity n
(§15.13.1), and one of the following is true:
- The method reference expression has the form
ReferenceType :: [TypeArguments] Identifier
and at least one potentially applicable method is either (i) static and supports arity n
, or (ii) not static and supports arity n-1
.
您要使用的函数类型的元数为 2
void accept(T t, U u);
并且 ArrayList::add
引用的方法具有 arity 1,并且它不是静态的。它使其具有潜在的适用性。
我知道如果引用的方法采用与功能接口相同数量的参数并且return相同的类型,则方法引用可以用于实现功能接口,但为什么在某些情况下引用的方法参数数量与功能接口不同,但仍然兼容?
我有一个简单的 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 个输入参数,但功能接口需要 2 个。
任何答案将不胜感激。谢谢!
第一个参数是要在 add
上调用的 ArrayList。
在这种情况下,
ArrayList::add
表示
(list, obj) -> list.add(obj)
这是一个 BiConsumer。
15.12.2.1. Identify Potentially Applicable Methods
A method reference expression (§15.13) is potentially compatible with a functional interface type
T
if, where the arity of the function type ofT
isn
, there exists at least one potentially applicable method when the method reference expression targets the function type with arityn
(§15.13.1), and one of the following is true:
- The method reference expression has the form
ReferenceType :: [TypeArguments] Identifier
and at least one potentially applicable method is either (i) static and supports arityn
, or (ii) not static and supports arityn-1
.
您要使用的函数类型的元数为 2
void accept(T t, U u);
并且 ArrayList::add
引用的方法具有 arity 1,并且它不是静态的。它使其具有潜在的适用性。