java.lang.ClassCastException:jdk.nashorn.internal.objects.NativeArray无法强制转换为java.lang.Comparable

时间:2014-04-16 05:02:56

标签: java javascript nashorn

使用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) } ); 

1 个答案:

答案 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方法,所以对于如何处理这个参数存在一些模糊性。