2009-07-04 5 views
8

Ich habe eine Methode, die wie folgt auf Java aussieht:JSR223: Aufruf Java „varargs“ Methoden aus Skript

public void myMethod(Object... parms); 

Aber ich kann diese Methode nicht aufrufen, wie aus den Skripten erwartet.

Wenn in Rubin, ich mache:

$myObject.myMethod(42); 

Es mir org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object

gibt Wenn ich folgend in Javascript versuchen:

myObject.myMethod(42); 

Dann gibt es mir sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

Natürlich, wenn ich die Signatur ändere, um einen zu singen Das Objekt funktioniert dann.

Ich nehme an, dass dies daran liegt, dass jemand entlang der Linie nicht zu konvertieren, sagen wir Integer zu Integer[] mit dem Wert an der ersten Position.

Ich glaube, so etwas wie myMethod({42, 2009}) würde in Ruby funktionieren, aber das scheint hässlich - ich wollte einfach myMethod(42, 2009) tun, um es weniger verwirrend, speziell für andere Sprachen zu machen. Gibt es dafür einen besseren Workaround?

Danke.

Antwort

0

Varargs werden vom Compiler als Object [] behandelt, was die Fehlermeldung beschreibt.

Ich habe keine JRuby-Erfahrung, aber funktioniert es, wenn Sie ein Array-Argument haben?

2

Java behandelt die Argumentliste mit variabler Länge intern als Array, dessen Elemente alle den gleichen Typ haben. Aus diesem Grund müssen Sie in Ihrem JRuby-Skript ein Array von Objekten bereitstellen.

Es funktioniert wie folgt:

myMethod [42, 2009].to_java 

Die to_java Methode ein Java-Array von einem Ruby-Array konstruiert. Standardmäßig erstellt to_java Object-Arrays in diesem Fall wie benötigt. Wenn Sie ein String-Array benötigen würden Sie

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

Mehr dazu verwenden, an den JRuby wiki

+0

ein anderes Beispiel: jruby -rjava-‚fmt = java.util.Formatter.new(); puts fmt.format ("|% 4s |", ["üü"]. to_java) ' – reto