【问题标题】:How to resolve incorrect parameters from LambdaMetafactory如何从 LambdaMetafactory 解决不正确的参数
【发布时间】:2015-09-23 22:04:23
【问题描述】:

我正在尝试使用 LambdaMetafactory.metafactory() 在 App.java 的 main 方法中执行带注释的方法。代码可以在这里找到:code on github

如果我试图执行这段代码,它会抛出异常:

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

【问题讨论】:

  • 不要只链接到整个项目的主页。在此处发布您的问题的代码。

标签: java lambda method-reference


【解决方案1】:

使用代码

TransferExecutor transferExecutor= new TransferExecutorImpl();
Function<Transfer, Void> commonLambda = transferExecutor::execute;

您将Function 绑定到TransferExecutor 的特定实例。您的动态创建代码缺少用于调用实例方法TransferExecutorImpl.execute 的实例。这就是异常试图告诉你的。

实例方法需要调用目标实例,因此您的目标方法具有(TransferExecutor,Transfer)→Void 的功能签名。

您可以使用此方法创建一个BiFunction&lt;TransferExecutor,Transfer, Void&gt;,或者将一个实例绑定到它,就像您的transferExecutor::execute 方法参考一样。对于后者

  • 更改调用类型以接收TransferExecutor 的实例

    MethodType invokedType = MethodType.methodType(
                                 Function.class, TransferExecutorImpl.class);
    
  • 在调用时提供参数:

    … .getTarget().invokeExact((TransferExecutorImpl)transferExecutor);
    

请注意,仍然存在细微差别。声明Function&lt;Transfer, Void&gt; commonLambda = transferExecutor::execute; 指的是接口方法,而您通过注释标识的方法是TransferExecutorImpl 中声明的方法。

关于绑定捕获值,请参阅thisthat answer 了解更多说明和示例。

【讨论】:

    【解决方案2】:

    错误试图告诉您没有传递其他参数。它需要一个,但你没有通过它。

    我建议你查看你传递的参数,并将它们与构建 lambda 时实际传递的参数进行比较。

    先写下你想要做的事情和一个 lambda,看看你应该传递什么参数。

    【讨论】:

    • 我在参数中找不到错误,因此我已就上面的代码寻求帮助。
    • @EvgeniyFitsner 您是否尝试过我将您的详细信息与编译器生成的详细信息进行比较的建议?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2014-03-15
    • 1970-01-01
    相关资源
    最近更新 更多