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.

È stato utile?

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
scroll top