使用lambda (:: operator)调用方法引用



我见过如下的一些方法:

像这样调用:

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()方法时,通过传递Bank类的addCustomer方法来调用customerInput方法。但这似乎是一个递归调用。那么,它的意思是什么,你能给一个简短的例子吗?

提前感谢。

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

让我们假设customerInput()的参数是一个具有如下方法的接口:

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

现在你可以传递任何与这个签名匹配的方法引用,并且同样的方法解析规则适用于Java对普通方法调用,例如,如果你有两个方法void foo(int x)void foo(long x),并且调用foo(2),编译器将需要确定你是打算调用第一个方法还是第二个方法(这里第一个方法将被选择,因为1int的字面量)。

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

让我们假设我们有以下类:

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) { ... }

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

相关内容

  • 没有找到相关文章

最新更新