2015-09-04 149 views
3

我試圖在App.java的主要方法內執行註釋的方法LambdaMetafactory.metafactory()。代碼可以在這裏找到:code on github如何解決來自LambdaMetafactory的不正確參數

如果我試圖執行此代碼,它會拋出異常:

Incorrect number of parameters for instance method invokeVirtual com.drfits.transfer.TransferExecutorImpl.execute:(Transfer)void; 0 captured parameters, 1 functional interface method parameters, 1 implementation parameters 
+2

不要只鏈接到整個項目的主頁。在這裏發佈你的問題的代碼。 –

回答

2

錯誤是想告訴你不及格另一個參數。它期望一個,但你沒有通過它。

我建議你看看你傳遞的參數,並將它們與構建lambda時實際傳遞的參數進行比較。

寫下你想要做的事情,先寫一個lambda表達式,看看你應該傳遞什麼參數。

+0

我無法在參數中找到錯誤,因此我已經向上面的代碼請求幫助。 –

+0

@EvgeniyFitsner您是否嘗試過將您的詳細信息與編譯器生成的內容進行比較的建議? –

+0

當然,但我找不到什麼是不正確的 –

3

使用代碼

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中聲明的方法。

關於綁定捕獲值,有關更多解釋和示例,請參見thisthat answer

相關問題