Lanciare oggetti in JRuby
-
22-09-2019 - |
Domanda
Esiste un modo per trasmettere esplicitamente un oggetto Java a un'altra classe Java da JRuby?
A volte vorrei poter invocare SomeJavaClass#aMethod(MySuperClass)
piuttosto che SomeJavaClass#aMethod(MyClass)
da JRuby.
Da Java, farei questo:
someJavaObject.aMethod( (MySuperClass) myObj );
ma non ho visto un #cast
metodo ruby o qualcosa del genere per fare l'equivalente di JRuby.
Nota questa la domanda Casting di oggetti Java da JRuby manca una risposta per il caso generale, motivo per cui ripropongo la domanda.
Soluzione
Devi utilizzare la funzionalità #java_send o #java_alias disponibile a partire da JRuby 1.4 per selezionare il metodo che desideri chiamare.Esempio:
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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow