【问题标题】:java.lang.ClassCastException: jdk.nashorn.internal.objects.NativeArray cannot be cast to java.lang.Comparablejava.lang.ClassCastException:jdk.nashorn.internal.objects.NativeArray 不能转换为 java.lang.Comparable
【发布时间】:2014-04-16 05:02:55
【问题描述】:

使用 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 集合的方法是什么?

更新:

感谢 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 javascript nashorn


    【解决方案1】:

    使用java.util.Arrays.asList 将创建一个数组,其中一个元素是 JS 数组。 JS 数组不是 Java 数组...

    使用Java.to(jsArray, Java.type('java.util.List')) 代替java.util.Arrays.asList。结果列表将由 JS 数组支持,因此对其中一个的更改将由另一个反映。也可以只用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.to(myJsObject, Java.type('com.xyz.MyClass')) 不起作用,我得到 Unsupported Java.to target type com.xyz.MyClass
    猜你喜欢
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 2013-10-24
    • 2015-06-29
    相关资源
    最近更新 更多