2009-07-04 22 views
8

方法,我有一個看起來像這樣基於Java的方法:JSR223:中調用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)以減少混淆,特別是對於其他語言。有沒有更好的解決方法呢?

謝謝。

回答

0

可變參數由編譯器作爲Object []處理,這是錯誤消息描述的內容。

我沒有JRuby的經驗,但是如果您有數組參數,它會工作嗎?

2

Java在內部將可變長度參數列表視爲一個數組,其元素都是相同的類型。這就是您需要在JRuby腳本中提供對象數組的原因。

它的工作原理是這樣的:

myMethod [42, 2009].to_java 

to_java方法構造從一個Ruby數組Java數組。默認情況下,to_java在這種情況下根據需要構造對象數組。如果需要一個字符串數組你會使用

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

更多內容在JRuby wiki

+0

另一個例子: jruby的-rjava -e「FMT = java.util.Formatter.new();放fmt.format(「|%4s |」,[「üü」]。to_java)' – reto 2010-02-26 12:52:37