8

我有一个在 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

当然,如果我将签名更改为采用单个对象,那么它就可以工作。

我认为这是因为沿线的某个人不知道如何转换,比如说第一个位置IntegerInteger[]值。

我相信类似的东西myMethod({42, 2009})可以在 Ruby 中工作,但这看起来很丑 - 我希望能够myMethod(42, 2009)让它不那么混乱,特别是对于其他语言。有没有更好的解决方法?

谢谢。

4

3 回答 3

2

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

它是这样工作的:

myMethod [42, 2009].to_java

to_java方法从 Ruby 数组构造一个 Java 数组。默认情况下,to_java在这种情况下根据需要构造 Object 数组。如果你需要一个字符串数组,你会使用

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

更多关于这在JRuby wiki

于 2009-10-16T11:10:52.273 回答
1

这似乎是 jruby 中的一个已知错误。请参阅Java 对象/类的方法分派 应尝试查找匹配的可变参数方法,并在尝试将参数传递给定义为具有可变长度参数的 Java 方法时抛出 NameError

根据链接 Rhino 确实支持 vararg

于 2009-07-04T21:23:54.320 回答
0

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

我没有 JRuby 经验,但是如果你有一个数组参数,它会起作用吗?

于 2009-07-04T22:20:35.220 回答