Как разрешить неправильные параметры из LambdaMetafactory

Я пытаюсь выполнить аннотированный метод в основном методе в App.java с помощью LambdaMetafactory.metafactory() . Код можно найти здесь: код на 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

person Evgeniy Fitsner    schedule 04.09.2015    source источник
comment
Не просто ссылайтесь на домашнюю страницу всего проекта. Разместите здесь код, о котором ваш вопрос.   -  person Marko Topolnik    schedule 04.09.2015


Ответы (2)


Использование кода

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.

Что касается привязки захваченных значений, см. это и этот ответ для получения дополнительных объяснений и примеров.

person Holger    schedule 23.09.2015

Ошибка пытается сказать, что вы не передаете другие параметры. Он ожидает один, но вы не передаете его.

Я предлагаю вам посмотреть параметры, которые вы передаете, и сравнить их с параметрами, фактически переданными при построении лямбды.

Сначала напишите, что вы пытаетесь сделать, и лямбду, и посмотрите, какие параметры вы должны передавать.

person Peter Lawrey    schedule 04.09.2015
comment
Я не смог найти ошибку в параметрах, поэтому попросил помощи с кодом выше. - person Evgeniy Fitsner; 13.09.2015
comment
@EvgeniyFitsner, вы попробовали мое предложение сравнить ваши данные с теми, которые генерирует компилятор? - person Peter Lawrey; 13.09.2015