使用Nashorn运行JavaScript时
var jsArray = [7,4,1,8,3,2];
var list = java.util.Arrays.asList(jsArray);
java.util.Collections.sort(list);
list.forEach(function(el) { print(el) } );
我得到了
Exception in thread "main" java.lang.ClassCastException: jdk.nashorn.internal.objects.NativeArray cannot be cast to java.lang.Comparable
at java.util.Collections.sort(Collections.java:170)
在JavaScript中使用Java Collections的方法是什么?
更新:
感谢Attila,并非JS和JJS脚本都产生相同的输出
var jsArray = [1,2,3,4];
jsArray.forEach(function(el) { print(el) } );
var jsArray = [1,2,3,4];
//var list = java.util.Arrays.asList(jsArray);
var list = Java.to(jsArray, Java.type('java.util.List'))
list.forEach(function(el) { print(el) } );
答案 0 :(得分:2)
使用java.util.Arrays.asList
将创建一个数组,其中一个元素是JS数组。 JS数组不是Java数组......
而不是java.util.Arrays.asList
,请使用Java.to(jsArray, Java.type('java.util.List'))
。结果列表将由JS数组支持,因此对一个的更改将由另一个反映。您还可以将JS数组转换为仅Java.to(jsArray)
的Java数组(相当于Java.to(jsArray, Java.type('java.lang.Object[]')
。因此,如果您想要完成数组转换步骤,可以使用java.util.Arrays.asList(Java.to(jsArray));
。
通常,在Java方法签名指定数组参数的大多数情况下,Nashorn会自动将JS数组转换为Java数组,因此您不必明确地使用Java.to()
。遗憾的是Arrays.asList(T...)
是一种vararg方法,所以对于如何处理这个参数存在一些模糊性。