12

有没有一种方法可以将一个 Java 对象从 JRuby 显式转换为另一个 Java 类?

有时我希望能够调用SomeJavaClass#aMethod(MySuperClass)而不是SomeJavaClass#aMethod(MyClass)从 JRuby 调用。

从Java,我会这样做:

someJavaObject.aMethod( (MySuperClass) myObj );

但我没有看到#castruby​​ 方法或类似的东西来做 JRuby 的等价物。

请注意Casting Java Objects From JRuby的问题缺乏一般情况的答案,这就是我重新提出这个问题的原因。

4

1 回答 1

11

您需要使用从 JRuby 1.4 开始可用的#java_send#java_alias功能来选择您希望调用的方法。例子:

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
于 2009-11-24T22:02:37.463 回答