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

标签 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) } ); 

最佳答案

使用 java.util.Arrays.asList将创建一个包含单个元素的数组作为 JS 数组。 JS 数组不是 Java 数组...

而不是 java.util.Arrays.asList , 使用 Java.to(jsArray, Java.type('java.util.List')) .结果列表将由 JS 数组支持,因此对一个的更改将由另一个反射(reflect)出来。您还可以使用 Java.to(jsArray) 将 JS 数组转换为 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...)不幸的是,它是一个可变参数方法,因此对于如何处理参数存在一些歧义。

关于java.lang.ClassCastException : jdk. nashorn.internal.objects.NativeArray 无法转换为 java.lang.Comparable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23100392/

相关文章:

javascript - 基本 JS 对象 {a :1, b :2} not supported in Nashorn?

java - "Redraw"LinearLayout View 更改选项

javascript - Paper.js 中的事件处理程序

javascript - 更新部分映射的 ko 模型

java - 将 javascript Web 应用程序链接到 java

javascript - Java Nashorn - 如何在 Java 中定义接受匿名函数作为参数的 JavaScript 函数?

java - Java是否需要时间来调用方法?

java - 如何保证 equals() 和 hashCode() 是同步的?

java - 线程调度和同步

javascript - 为什么有两种不同的Javascript?