Нашорн как передать функциональный интерфейс из javascript в java как параметр метода - PullRequest
0 голосов
/ 13 сентября 2018

В Java я определил функциональный интерфейс, который может принимать другой функциональный интерфейс в качестве параметра.

public static TriConsumer<SomeObject, Number, Consumer<SomeObject>> test = ....

Я инициализировал механизм nashorn с включенными оптимистическими типами и передал параметр "test" в nashorn через привязки.

Bindings bindings = new SimpleBindings();
bindings.put("test", test);
scriptEngine.setBindings(bindings, ScriptContext.ENGINE_SCOPE);

Теперь я могу вызывать этот метод как функцию в JavaScript.

test(...params...);

Однако я не могу понять, что является правильным путем к методу, в основном у меня проблемы с параметром thid - объектом-потребителем.

Если я пытаюсь вызвать функцию следующим образом:

  test(anObject, aNumber, function(anAnotherObject) {
              anAnotherObject.callSomeFunction(...)
        });

Я получаю сообщение об ошибке:

ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to java.util.function.Consumer

В конце концов я смог вызвать метод со следующим синтаксисом:

   var Consumer = Java.type(consumer.package.Consumer)
   test(anObject, aNumber, new (Java.extend(Consumer, {
       accept: function(anObject) {

       }
   })));

Этот подход я бы хотел избежать.Я пытаюсь построить проект, чтобы он был полезен для людей, которые не знают внутренности Java.Что-нибудь подобное может запутать всех моих пользователей.

Можно ли каким-либо образом упростить синтаксис?

(Я застрял на Java 8, я не могу обновить проект для использования java 9 или 10)

...