JSR223:从脚本调用Java“varargs”方法

时间:2009-07-04 21:15:29

标签: java scripting variadic-functions

我在Java上有一个看起来像这样的方法:

public void myMethod(Object... parms);

但我无法按照预期的方式调用此方法。

如果,在红宝石中,我这样做:

$myObject.myMethod(42);

它给了我org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object

如果我在Javascript中尝试以下内容:

myObject.myMethod(42);

然后它给了我sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

当然,如果我更改签名以获取单个对象,那么它可以正常工作。

我认为这是因为该行的某些人不知道如何转换,请将Integer更改为Integer[]并使用第一个位置的值。

我相信像myMethod({42, 2009})这样的东西可以在Ruby中运行,但这看起来很难看 - 我希望能够myMethod(42, 2009)让它更容易混淆,特别是对于其他语言。有没有更好的解决方法呢?

感谢。

3 个答案:

答案 0 :(得分:2)

Java内部将变长参数列表视为一个数组,其元素都是相同的类型。这就是为什么需要在JRuby脚本中提供一组对象的原因。

它的工作原理如下:

myMethod [42, 2009].to_java

to_java方法从Ruby数组构造Java数组。默认情况下,to_java在这种情况下根据需要构造Object数组。如果需要String数组,可以使用

["a","b","c"].to_java(:string)

有关JRuby wiki

的详情

答案 1 :(得分:1)

答案 2 :(得分:0)

Varargs由编译器作为Object []处理,这是错误消息描述的内容。

我没有JRuby经验,但如果你有一个数组参数,它是否有效?