2009-11-24 18 views
11

Gibt es eine Möglichkeit, ein Java-Objekt explizit von JRuby in eine andere Java-Klasse zu werfen?Casting-Objekte in JRuby

Manchmal möchte ich SomeJavaClass#aMethod(MySuperClass) anstelle von SomeJavaClass#aMethod(MyClass) von JRuby aufrufen können.

Von Java, würde ich dies tun:

someJavaObject.aMethod((MySuperClass) myObj); 

aber ich #cast Ruby-Methode oder so etwas nicht das Äquivalent von JRuby zu tun sehen.

Hinweis, dass die Frage Casting Java Objects From JRuby eine Antwort für den allgemeinen Fall fehlt, weshalb ich die Frage erneut stelle.

Antwort

10

Sie müssen entweder die Funktion #java_send oder #java_alias verwenden, die ab JRuby 1.4 verfügbar ist, um die Methode auszuwählen, die Sie aufrufen möchten. Beispiel:

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

Ich denke, es wäre nützlich hinzuzufügen, dass wenn Sie versuchen, in nicht-primitive Klassen zu werfen, sollten Sie die vollständige Hierarchie verwenden. Um zB 'obj' in die' ij.text.TextWindow' Klasse zu schreiben, müßte man 'obj.to_java (Java :: Ij :: text :: TextWindow)' schreiben. – gregoltsov