我在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)
让它更容易混淆,特别是对于其他语言。有没有更好的解决方法呢?
感谢。
答案 0 :(得分:2)
Java内部将变长参数列表视为一个数组,其元素都是相同的类型。这就是为什么需要在JRuby脚本中提供一组对象的原因。
它的工作原理如下:
myMethod [42, 2009].to_java
to_java
方法从Ruby数组构造Java数组。默认情况下,to_java
在这种情况下根据需要构造Object数组。如果需要String数组,可以使用
["a","b","c"].to_java(:string)
的详情
答案 1 :(得分:1)
这似乎是jruby中的一个已知错误。请参阅method dispatch on Java objects / classes should try to find a matching varargs method和NameError thrown when trying to pass argument to a Java method that is defined as having variable length arguments。
根据Rhino的链接support vararg。
答案 2 :(得分:0)
Varargs由编译器作为Object []处理,这是错误消息描述的内容。
我没有JRuby经验,但如果你有一个数组参数,它是否有效?