2009-11-24 6 views
11

JRubyからJavaオブジェクトを別のJavaクラスに明示的にキャストする方法はありますか?JRubyでのオブジェクトのキャスト

JRubyのSomeJavaClass#aMethod(MyClass)ではなく、SomeJavaClass#aMethod(MySuperClass)を呼び出すことができます。

Javaから、私はこれを行うだろう:

someJavaObject.aMethod((MySuperClass) myObj); 

を私はJRubyのから同等の操作を行うためにそのよう#castルビー法または何も表示されませんでした。

Casting Java Objects From JRubyの質問には、一般的なケースの回答がないことがわかります。そのため、私は質問しています。

答えて

10

呼び出したいメソッドを選択するには、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 
+1

非プリミティブなクラスにキャストしようとしている場合は、完全な階層を使用することをお勧めします。つまり、 'obj'を' ij.text.TextWindow'クラスにキャストするには、 'obj.to_java(Java :: Ij :: text :: TextWindow)'と書かなければなりません。 – gregoltsov

関連する問題