Objetos de fundição em Jruby
-
22-09-2019 - |
Pergunta
Existe uma maneira de lançar explicitamente um objeto Java para outra aula de Java de Jruby?
Às vezes eu quero ser capaz de invocar SomeJavaClass#aMethod(MySuperClass)
ao invés de SomeJavaClass#aMethod(MyClass)
de Jruby.
De Java, eu faria isso:
someJavaObject.aMethod( (MySuperClass) myObj );
Mas eu não vi um #cast
Método Ruby ou algo assim para fazer o equivalente a Jruby.
Observação que a pergunta Lançar objetos java de Jruby Falta uma resposta para o caso geral, e é por isso que estou novamente assentando a pergunta.
Solução
Você precisa usar o recurso #java_send ou #java_alias disponíveis, começando com o Jruby 1.4 para selecionar o método que deseja ligar. Exemplo:
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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow