Nashorn JS对象是否适用于java.util.Map?

时间:2013-12-11 07:02:40

标签: java-8 nashorn

我有java方法

void someMethod(String str, Map map) {
    ...
}

来自JS调用此方法

var map = new Object()
map.key1 = "val1"
...someMethod(str, map)

例外:

java.lang.NoSuchMethodException: None of the fixed arity signatures
[(java.lang.String, java.util.Map)] of method org.prjctor.shell.Bash.eval
match the argument types [java.lang.String, jdk.nashorn.internal.scripts.JO]

但是在Nashorn文档“Java和JavaScript之间的数据类型映射”中说“每个JavaScript对象也是java.util.Map,因此接收地图的API将直接接收它们”。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

同意之前的答案,您无法按照文档所暗示的那样执行此操作。 但是,您可以按如下方式创建并传递地图

..
var HashMap = Java.type('java.util.HashMap');
var map = new HashMap();
map.put('1', 'val1');
...someMethod(str, map)

答案 1 :(得分:0)

doc说“”每个JavaScript对象都实现了java.util.Map接口“。但是这个示例测试程序显示的并非如此。

public final class NashornTestMap {
    public static void main(String args[]) throws Exception{
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine nashorn = factory.getEngineByName("nashorn");
        nashorn.eval(""
                +"load(\"nashorn:mozilla_compat.js\");"
                + "importClass(Packages.NashornTestMap);"
                + "var map={};"
                + "map[\"Key\"]=String(\"Val\"); "
                + "var test = new NashornTestMap();"
                + "test.test(map);"
                + "");
    }

    public void test(Map<String, String> obj){
        System.out.println(obj);
    }       
}

上面的代码给出异常“线程中的异常”main“java.lang.ClassCastException:无法将jdk.nashorn.internal.scripts.JO4强制转换为java.util.Map”。这link证实了这一点。

但是,您可以在脚本中使用Map并直接调用java对象,如下所示。

public final class NashornTestMap {
    public static void main(String args[]) throws Exception{
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine nashorn = factory.getEngineByName("nashorn");
        nashorn.eval(""
                +"load(\"nashorn:mozilla_compat.js\");"
                + "importClass(Packages.NashornTestMap);"
                + "var HashMap = Java.type(\"java.util.HashMap\");"             
                + "var map = new HashMap();"
                + "map.put(0, \"value1\");"
                + "var test = new NashornTestMap();"
                + "test.test(map);"
                + "");
    }

    public void test(Map<String, String> obj){
        System.out.println(obj);
    }       

}

返回“{0 = value1}”