问题 在JRuby中投射对象


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

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

从Java开始,我会这样做:

someJavaObject.aMethod( (MySuperClass) myObj );

但我没有看到 #cast ruby方法或类似的东西来做JRuby的等效方法。

注意 那个问题 从JRuby转换Java对象 对于一般情况缺乏答案,这就是我重新提出这个问题的原因。


7717
2017-11-24 19:49


起源



答案:


您需要使用从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

10
2017-11-24 22:02



我认为如果你试图转换为非原始类,那么你应该使用完整的层次结构。所以,比方说,施展 obj 至 ij.text.TextWindow 上课,你必须写 obj.to_java(Java::Ij::text::TextWindow)。 - gregoltsov


答案:


您需要使用从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

10
2017-11-24 22:02



我认为如果你试图转换为非原始类,那么你应该使用完整的层次结构。所以,比方说,施展 obj 至 ij.text.TextWindow 上课,你必须写 obj.to_java(Java::Ij::text::TextWindow)。 - gregoltsov