使用代碼
TransferExecutor transferExecutor= new TransferExecutorImpl();
Function<Transfer, Void> commonLambda = transferExecutor::execute;
您在Function
結合的TransferExecutor
特定實例。您的動態創建代碼缺少調用實例方法TransferExecutorImpl.execute
的實例。這是例外試圖告訴你的。
實例方法需要調用目標實例,因此您的目標方法的功能簽名爲(TransferExecutor,Transfer)→Void
。
您可以使用此方法創建一個BiFunction<TransferExecutor,Transfer, Void>
或使用transferExecutor::execute
方法引用將實例綁定到該方法。對於後者
變化被調用的類型接收的TransferExecutor
MethodType invokedType = MethodType.methodType(
Function.class, TransferExecutorImpl.class);
一個實例提供的參數在調用:
… .getTarget().invokeExact((TransferExecutorImpl)transferExecutor);
注意,還有一個微妙的區別。語句Function<Transfer, Void> commonLambda = transferExecutor::execute;
引用接口方法,而通過註釋標識的方法是在TransferExecutorImpl
中聲明的方法。
關於綁定捕獲值,有關更多解釋和示例,請參見this和that answer。
不要只鏈接到整個項目的主頁。在這裏發佈你的問題的代碼。 –