使用lambda(::操作符)调用方法引用

问题描述 投票:0回答:1

我看到了一些方法,如下所示:

这样调用:

private static void addCustomerTransaction() {
  customerInput((bank, branchName, customerName, transaction) ->
      bank.addCustomerTransaction(branchName, customerName, transaction));
}

private static void addCustomer() {
  customerInput((bank, branchName, customerName, transaction) ->
      bank.addCustomer(branchName, customerName, transaction));
}


或使用方法参考:

private static void addCustomerTransaction() {
  customerInput(Bank::addCustomerTransaction);
}

private static void addCustomer() {
  customerInput(Bank::addCustomer);
}

我是这样读代码的:当调用

addCustomerTransaction()
方法时,它通过传递
customerInput
类的
Bank
方法来调用
addCustomer
方法。但这似乎是一个递归调用。那么,这是什么意思,你能举个简单的例子吗?

提前致谢。

java class lambda method-reference
1个回答
0
投票

不,这不会是递归调用,因为

Bank::addCustomerTransaction
不会引用
private static void addCustomerTransaction()
,而是引用具有相同名称和合适签名的方法。我将提供一个简单的答案,但请查找有关此内容的正确教程以了解详细信息。

假设

customerInput()
的参数是一个具有如下方法的接口:

void takeInput(Bank bank, String branchName, String customerName, Transaction transaction);

现在您可以传递与此签名匹配的任何方法引用,并且 Java 用于普通方法调用的方法解析规则相同,即,如果您有 2 个方法

void foo(int x)
void foo(long x)
以及一个调用
foo(2)
,编译器将需要确定您是要调用第一个方法还是第二个方法(此处将选择第一个方法,因为
1
是一个
int
文字)。

有了这些规则,编译器如何选择适合您情况的方法?

假设我们有以下课程:

class Bank {
   void addCustomerTransaction(String branchName, String customerName, Transaction transaction) { ... }

   static void addCustomerTransaction() {
     customerInput(Bank::addCustomerTransaction);
   }
}

为什么这不是递归调用?

因为

void addCustomerTransaction()
void takeInput(Bank, String, String, Transaction)
所需的签名根本不匹配。

但是为什么实例方法

void addCustomerTransaction(String, String, Transaction)
会匹配呢?

那是因为实例方法隐式获取第一个参数,它是对实例的引用(即

this
引用),所以对于编译器该方法看起来像这样(内部静态方法和实例方法没有区别) ):

 void addCustomerTransaction(Bank, String, String, Transaction)

现在这与所需的签名匹配,因此可以调用该方法。

为了证明这一点,尝试添加具有相同签名的静态方法:

 static void addCustomerTransaction(Bank bank, String branchName, String customerName, Transaction transaction) { ... }

现在编译器无法决定是使用静态方法还是实例方法,它会告诉你。

© www.soinside.com 2019 - 2024. All rights reserved.