2009-11-24 110 views
11

有沒有一種方法可以將一個Java對象從JRuby中顯式投射到另一個Java類中?在JRuby中鑄造對象

有時我希望能夠從JRuby調用SomeJavaClass#aMethod(MySuperClass)而不是SomeJavaClass#aMethod(MyClass)

從Java,我應該這樣做:

someJavaObject.aMethod((MySuperClass) myObj); 

,但我沒有看到一個#cast紅寶石方法或類似的東西做從JRuby的等價物。

注意問題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 2012-10-03 14:12:14