Java 8 Nashorn脚本引擎无法将js数组转换为字符串[]

Java 8 Nashorn脚本引擎无法将js数组转换为字符串[],java-8,nashorn,scriptengine,Java 8,Nashorn,Scriptengine,Nashorn脚本引擎在将js数组作为参数传递以调用Java方法时,未能将其转换为字符串[]。有趣的是,它能够在某些情况下成功转换,而在其他情况下失败。是什么导致它在某些情况下工作,但在其他情况下失败 下面给出了一个简单的示例代码片段,以说明什么是有效的,什么是无效的 public class SampleScriptEngine implements Function<String[], String> { public String apply(String... me

Nashorn脚本引擎在将js数组作为参数传递以调用Java方法时,未能将其转换为字符串[]。有趣的是,它能够在某些情况下成功转换,而在其他情况下失败。是什么导致它在某些情况下工作,但在其他情况下失败

下面给出了一个简单的示例代码片段,以说明什么是有效的,什么是无效的

public class SampleScriptEngine implements Function<String[], String> {

    public String apply(String... message) {
        return format("Orders: %s", asList(message));
    }

    public static void main(String args[]) throws ScriptException {
        ScriptEngine scriptEngine = new NashornScriptEngineFactory()
                .getScriptEngine(new String[]{"-strict", "--no-java", "--no-syntax-extensions"});

        scriptEngine.getBindings(ScriptContext.ENGINE_SCOPE).put("apply", new SampleScriptEngine());

        // script evaluation
        String object = (String) scriptEngine.eval("apply(['order1', 'order2']);");

        System.out.println(object);
    }
}

脚本2:

scriptEngine.eval("process(true ? ['order1', 'order2'] : []);");
工作脚本的输出(1和2):

以下两个脚本(3和4)失败

脚本-3:

scriptEngine.eval("var orders = ['order1', 'order2']; process(orders);");
脚本-4:

scriptEngine.eval("var isOk = true; process(isOk ? ['order1', 'order2']: []);");
失败脚本的堆栈跟踪(3和4):

线程“main”java.lang.ClassCastException中的异常:jdk.nashorn.api.scripting.ScriptionObjectMirror不能强制转换为[Ljava.lang.String; 在com.barclays.bidv.temp.research.SampleScriptEngine.apply(SampleScriptEngine.java:13) 在jdk.nashorn.internal.scripts.Script$^eval\:程序(:1) 位于jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637) 位于jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494) 位于jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393) 位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:446) 位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:403) 位于jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399) 位于jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155) 位于javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264) 在com.barclays.bidv.temp.research.SampleScriptEngine.main(SampleScriptEngine.java:24) 进程已完成,退出代码为1
scriptEngine.eval("var orders = ['order1', 'order2']; process(orders);");
scriptEngine.eval("var isOk = true; process(isOk ? ['order1', 'order2']: []);");
Exception in thread "main" java.lang.ClassCastException: jdk.nashorn.api.scripting.ScriptObjectMirror cannot be cast to [Ljava.lang.String;
    at com.barclays.bidv.temp.research.SampleScriptEngine.apply(SampleScriptEngine.java:13)
    at jdk.nashorn.internal.scripts.Script$\^eval\_.:program(<eval>:1)
    at jdk.nashorn.internal.runtime.ScriptFunctionData.invoke(ScriptFunctionData.java:637)
    at jdk.nashorn.internal.runtime.ScriptFunction.invoke(ScriptFunction.java:494)
    at jdk.nashorn.internal.runtime.ScriptRuntime.apply(ScriptRuntime.java:393)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:446)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:403)
    at jdk.nashorn.api.scripting.NashornScriptEngine.evalImpl(NashornScriptEngine.java:399)
    at jdk.nashorn.api.scripting.NashornScriptEngine.eval(NashornScriptEngine.java:155)
    at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:264)
    at com.barclays.bidv.temp.research.SampleScriptEngine.main(SampleScriptEngine.java:24)

Process finished with exit code 1