Кастинг объектов в JRuby
-
22-09-2019 - |
Вопрос
Есть ли способ, которым я могу явно привести один объект Java к другому классу Java из JRuby?
Иногда я хочу иметь возможность вызывать SomeJavaClass#aMethod(MySuperClass)
вместо того , чтобы SomeJavaClass#aMethod(MyClass)
от Джруби.
С Java я бы сделал это:
someJavaObject.aMethod( (MySuperClass) myObj );
но я не видел #cast
метод ruby или что-нибудь подобное, чтобы сделать эквивалент из JRuby.
Примечание в том, что вопрос Приведение объектов Java из JRuby не хватает ответа для общего случая, вот почему я повторно задаю этот вопрос.
Решение
Вам необходимо использовать либо функцию #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
Не связан с StackOverflow