В 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)