2009-11-24 5 views
11

하나의 Java 객체를 JRuby의 다른 Java 클래스로 명시 적으로 캐스팅 할 수있는 방법이 있습니까?JRuby의 객체 캐스팅

때로는 JRuby에서 SomeJavaClass#aMethod(MyClass)이 아닌 SomeJavaClass#aMethod(MySuperClass)을 호출 할 수 있기를 원합니다.

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