Nashorn如何将功能接口从javascript作为方法参数传递给Java

时间:2018-09-13 08:01:57

标签: java nashorn

在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参数-Consumer对象有麻烦。

如果我尝试按以下方式调用函数:

  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)

0 个答案:

没有答案