Использование кода
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 для получения дополнительных пояснений и примеров.
Не просто ссылку на домашнюю страницу всего проекта. Отправьте сюда код, о котором идет речь. –