2009-11-24 19 views
11

¿Hay alguna manera de convertir explícitamente un objeto Java a otra clase Java de JRuby?Casting de objetos en JRuby

A veces deseo poder invocar SomeJavaClass#aMethod(MySuperClass) en lugar de SomeJavaClass#aMethod(MyClass) de JRuby.

De Java, que haría esto:

someJavaObject.aMethod((MySuperClass) myObj); 

pero no vi un método #cast rubí o algo por el estilo para hacer el equivalente de JRuby.

Nota que la pregunta Casting Java Objects From JRuby no tiene respuesta para el caso general, por lo que estoy volviendo a hacer la pregunta.

Respuesta

10

Debe utilizar la función #java_send o #java_alias disponible comenzando con JRuby 1.4 para seleccionar el método que desea llamar. Ejemplo:

class Java::JavaUtil::Arrays 
    boolean_array_class = [false].to_java(:boolean).java_class 
    java_alias :boolean_equals, :equals, [boolean_array_class, boolean_array_class] 
end 

a1 = [false, true] 
Java::JavaUtil::Arrays.boolean_equals a1, a1 
# => TypeError: for method Arrays.equals expected [class [Z, class [Z]; got: [org.jruby.RubyArray,org.jruby.RubyArray]; error: argument type mismatch 
Java::JavaUtil::Arrays.boolean_equals a1.to_java(:boolean), a1.to_java(:boolean) 
# => true 
a2 = [true, false] 
Java::JavaUtil::Arrays.boolean_equals a1.to_java(:boolean), a2.to_java(:boolean) 
# => false 
+1

Creo que sería útil agregar que si está tratando de convertir a clases no primitivas, debe usar la jerarquía completa. Así que, por ejemplo, para convertir la clase 'obj' a' ij.text.TextWindow', tendría que escribir 'obj.to_java (Java :: Ij :: text :: TextWindow)'. – gregoltsov