Я пытаюсь понять, как передать мою функцию Javascript на мой метод Java, чтобы я мог вызвать его во время выполнения.Передать функцию Javascript как функциональный тип интерфейса для Java-метода с помощью Nashorn
У меня есть следующий метод Java Подпись:
public static void createBlock(String domain, String name, String eventType, EventFunction eventHandler)
Я называю это от Javascript, как это:
function main() {
BlockManager.createBlock('sarah-egg', 'enderBlock', 'breakBlock', func);
}
function func (event) {
event.world.createExplosion(null, event.pos.getX(), event.pos.getY(), event.pos.getZ, 10, true);
}
И я сделал свой Java функциональный интерфейс, EventFunction, как это:
package com.learntomod.event;
@FunctionalInterface
public interface EventFunction<T> {
void fun(T t);
}
Когда я запускаю его, я получаю эту ошибку:
Cannot cast jdk.nashorn.internal.objects.ScriptFunctionImpl to com.learntomod.event.EventFunction
Я попытался изменить EventFunction на Runnable и избавиться от параметра, и он сработал.
Любые идеи о том, что я могу делать неправильно?
Это не то, как работают функциональные интерфейсы. Они не являются ссылками на функции. Если я понимаю https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html, вы должны передать 'Invocable' свой метод Java. – zapl
Я также пробовал передавать invocable, а не делать это таким образом - и это тоже не сработало. Я понимаю, что оба «должны» работать, и способ, которым я пытаюсь это сделать, - это то, как люди рекомендуют использовать Java 8? Но я не уверен. Я перечитаю этот документ и попробую еще раз! :) Благодаря! –
Не могли бы вы опубликовать полный, но сжатый, воспроизводящий пример? – Tunaki