Ich habe eine Methode, die auf Java so aussieht:
%Vor%Aber ich kann diese Methode nicht wie erwartet von den Skripten aus aufrufen.
Wenn ich in Ruby:
%Vor% Es gibt mir org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object
Wenn ich Folgendes in Javascript versuche:
%Vor% 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 ein einzelnes Objekt zu nehmen, funktioniert es.
Ich nehme an, dass dies daran liegt, dass jemand entlang der Linie nicht wissen kann, wie man konvertiert, sagen wir Integer
zu Integer[]
mit dem Wert an der ersten Position.
Ich glaube, etwas wie myMethod({42, 2009})
würde in Ruby funktionieren, aber das scheint hässlich zu sein - ich wollte einfach myMethod(42, 2009)
machen, um es weniger verwirrend zu machen, speziell für andere Sprachen. Gibt es eine bessere Problemumgehung dafür?
Danke.
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 so:
%Vor% Die Methode to_java
konstruiert ein Java-Array aus einem Ruby-Array. Standardmäßig erstellt to_java
in diesem Fall Object-Arrays nach Bedarf. Wenn Sie ein String-Array benötigen, verwenden Sie
Mehr dazu im JRuby-Wiki
Es scheint, dass dies ein bekannter Bug in jruby ist. Siehe Methodenverteilung für Java-Objekte / Klassen sollte versuchen, eine passende varargs-Methode zu finden und NameError wird ausgelöst, wenn versucht wird, ein Argument an eine Java-Methode zu übergeben, die Argumente mit variabler Länge definiert .
Laut dem Link unterstützt Rhino vararg .
Varargs werden vom Compiler als ein Object [] behandelt, was die Fehlermeldung beschreibt.
Ich habe keine JRuby-Erfahrung, aber funktioniert es, wenn Sie ein Array-Argument haben?
Tags und Links java scripting variadic-functions