【问题标题】:JSR223: Calling Java "varargs" methods from scriptJSR223:从脚本调用 Java“可变参数”方法
【发布时间】:2009-07-04 21:15:29
【问题描述】:

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

public void myMethod(Object... parms);

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

如果,在 ruby​​ 中,我这样做:

$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) 以减少混乱,特别是对于其他语言。有没有更好的解决方法?

谢谢。

【问题讨论】:

    标签: java scripting variadic-functions


    【解决方案1】:

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

    它是这样工作的:

    myMethod [42, 2009].to_java
    

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

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

    更多信息请访问JRuby wiki

    【讨论】:

    • 另一个例子:jruby -rjava -e 'fmt = java.util.Formatter.new(); puts fmt.format("|%4s|", ["üü"].to_java)'
    【解决方案2】:
    【解决方案3】:

    编译器将可变参数作为错误消息描述的 Object[] 处理。

    我没有 JRuby 的经验,但是如果你有一个数组参数,它可以工作吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-15
      相关资源
      最近更新 更多