2009-07-04 30 views
8

que tienen un método que se parece a esto en Java:JSR223: llamar a Java "varargs" métodos de escritura

public void myMethod(Object... parms); 

Pero no pueden llamar a este método como se espera de los scripts.

Si, en rubí, que hago:

$myObject.myMethod(42); 

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

Si intento el siguiente en Javascript:

myObject.myMethod(42); 

Entonces me da sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

Por supuesto, si cambio la firma para tomar una canción le objeto, entonces funciona.

Supongo que esto se debe a que alguien a lo largo de la línea no sabe cómo convertir, digamos Integer a Integer[] con el valor en la primera posición.

Creo que algo como myMethod({42, 2009}) funcionaría en Ruby, pero esto parece feo: quería poder hacer myMethod(42, 2009) para hacerlo menos confuso, especialmente para otros idiomas. ¿Hay alguna solución mejor para esto?

Gracias.

Respuesta

0

Los varargs son manejados por el compilador como un Objeto [] que es lo que describe el mensaje de error.

No tengo experiencia en JRuby, pero ¿funciona si tiene un argumento de matriz?

2

Java trata internamente la lista de argumentos de longitud variable como una matriz cuyos elementos son todos del mismo tipo. Esa es la razón por la cual necesita proporcionar una matriz de objetos en su script JRuby.

funciona así:

myMethod [42, 2009].to_java 

El método to_java construye una matriz de Java a partir de un conjunto de Ruby. De forma predeterminada, to_java construye matrices de objetos según sea necesario en este caso. Si necesita una matriz de cadenas que usaría

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

Más sobre esto en el JRuby wiki

+0

otro ejemplo: jruby -rjava -e 'fmt = java.util.Formatter.new(); pone fmt.format ("|% 4s |", ["üü"]. to_java) ' – reto

Cuestiones relacionadas