2015-12-04 1 views
1

Я пытаюсь понять, как передать мою функцию 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 и избавиться от параметра, и он сработал.

Любые идеи о том, что я могу делать неправильно?

+1

Это не то, как работают функциональные интерфейсы. Они не являются ссылками на функции. Если я понимаю https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/prog_guide/api.html, вы должны передать 'Invocable' свой метод Java. – zapl

+0

Я также пробовал передавать invocable, а не делать это таким образом - и это тоже не сработало. Я понимаю, что оба «должны» работать, и способ, которым я пытаюсь это сделать, - это то, как люди рекомендуют использовать Java 8? Но я не уверен. Я перечитаю этот документ и попробую еще раз! :) Благодаря! –

+1

Не могли бы вы опубликовать полный, но сжатый, воспроизводящий пример? – Tunaki

ответ

2

ОК - так получается, что Кузница, возможно, была виновницей все время.

Forge делает некоторые неудобные вещи с изменением загрузчика классов, и поэтому Java, возможно, просто не изменил мою функцию JS на мой функциональный интерфейс EventFunction (или что-то в этом роде).

В любом случае - я нашел «решение» - я использовал https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html - который является частью Java Util, и поскольку Runnable работал, мы решили попробовать Function (который принимает параметр) и ... он работал !

Теперь мои пользовательские блоки взорвется, когда вы нарушаете их;) https://www.youtube.com/watch?v=7IJVeC48z6I&feature=youtu.be

Спасибо за вашу помощь, ребята!

 Смежные вопросы

  • Нет связанных вопросов^_^