JRuby

2009-11-24 18 views
11

में ऑब्जेक्ट कास्टिंग करना क्या कोई तरीका है कि मैं एक जावा ऑब्जेक्ट को जेआरबी से किसी अन्य जावा क्लास में स्पष्ट रूप से डाला जा सकता हूं?JRuby

कभी-कभी मैं SomeJavaClass#aMethod(MySuperClass) को SomeJavaClass#aMethod(MyClass) से JRuby से आमंत्रित करने में सक्षम होना चाहता हूं।

जावा से, मैं यह कर चाहते हैं:

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 (जावा :: Ij :: text :: TextWindow) लिखना होगा। – gregoltsov

संबंधित मुद्दे