Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 8 将Nashorn JS对象转换为java.util.Map是否有效?_Java 8_Nashorn - Fatal编程技术网

Java 8 将Nashorn JS对象转换为java.util.Map是否有效?

Java 8 将Nashorn JS对象转换为java.util.Map是否有效?,java-8,nashorn,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 met

我有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将直接接收它们”

我做错了什么?

上面说“每个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);
    }       
}
公共最终类NashornTestMap{
公共静态void main(字符串args[])引发异常{
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine nashorn=factory.getEngineByName(“nashorn”);
纳索恩估价(“)
+“加载(\“nashorn:mozilla\u compat.js\”)
+“导入类(Packages.nashortestmap);”
+“变量映射={};”
+“映射[\'Key\']=字符串(\'Val\”)
+“var test=new nashortestmap();”
+“测试。测试(地图);”
+ "");
}
公共空隙试验(Map obj){
系统输出打印项次(obj);
}       
}
上面的代码给出了异常“线程中的异常”main“java.lang.ClassCastException:无法将jdk.nashorn.internal.scripts.JO4转换为java.util.Map”。这证实了这一点

但是,您可以在脚本中使用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);
    }       

}
公共最终类NashornTestMap{
公共静态void main(字符串args[])引发异常{
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine nashorn=factory.getEngineByName(“nashorn”);
纳索恩估价(“)
+“加载(\“nashorn:mozilla\u compat.js\”)
+“导入类(Packages.nashortestmap);”
+“var HashMap=Java.type(\'Java.util.HashMap\”)
+“var map=new HashMap();”
+map.put(0,\'value1\'”
+“var test=new nashortestmap();”
+“测试。测试(地图);”
+ "");
}
公共空隙试验(Map obj){
系统输出打印项次(obj);
}       
}

返回“{0=value1}”

同意前面的答案,即您不能像文档中暗示的那样执行此操作。 但是,您可以创建并传递一个映射,如下所示

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

好吧,按照我阅读文档的方式,我会说你没有做错什么。你引用的语句(“每个JavaScript对象也是一个java.util.Map”)似乎是完全错误的,从类JO的继承结构可以看出:jdk.nashorn.internal.scripts.JO扩展了jdk.nashorn.internal.runtime.ScriptObject(实现jdk.nashorn.internal.runtime.PropertyAccess)扩展jdk.nashorn.internal.runtime.PropertyListenerManager(实现jdk.nashorn.internal.runtime.PropertyListener)扩展数组的java.lang.Objector“java.util.ArrayList”。