Подтвердить что ты не робот

Кастинг объектов в JRuby

Есть ли способ явным образом передать один объект Java другому классу Java из JRuby?

Иногда я хочу иметь возможность запускать SomeJavaClass#aMethod(MySuperClass) вместо SomeJavaClass#aMethod(MyClass) из JRuby.

Из Java я бы сделал это:

someJavaObject.aMethod( (MySuperClass) myObj );

но я не видел метод ruby ​​ #cast или что-то в этом роде, чтобы сделать эквивалент от JRuby.

Примечание, что вопрос Литье объектов Java из JRuby не содержит ответа для общего случая, поэтому я перепрошу вопрос.

4b9b3361

Ответ 1

Вам нужно использовать либо функцию #java_send, либо #java_alias, начиная с JRuby 1.4, чтобы выбрать метод, который вы хотите вызвать. Пример:

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