2009-07-04 21 views
8

से तरीकों मैं एक विधि है कि जावा पर इस तरह दिखता है:JSR223: कॉलिंग जावा "varargs" स्क्रिप्ट

public void myMethod(Object... parms); 

लेकिन स्क्रिप्ट से उम्मीद के रूप में मैं इस विधि कॉल नहीं कर सकते।

हैं, माणिक में, मैं करता हूँ:

$myObject.myMethod(42); 

यह मेरे org.jruby.exceptions.RaiseException: could not coerce Fixnum to class [Ljava.lang.Object

देता है अगर मैं जावास्क्रिप्ट में निम्न प्रयास करें:

myObject.myMethod(42); 

तो यह मुझे sun.org.mozilla.javascript.internal.EvaluatorException: Can't find method MyClass.test(number). (#2) in at line number 2

देता है

बेशक, अगर मैं एक गायन लेने के लिए हस्ताक्षर बदलता हूं ले ऑब्जेक्ट तो यह काम करता है।

मुझे लगता है कि ऐसा इसलिए है क्योंकि लाइन के साथ किसी को यह नहीं पता कि Integer से Integer[] कहें कि पहले स्थान पर मूल्य के साथ।

मेरा मानना ​​है कि myMethod({42, 2009}) की तरह कुछ रूबी में काम करेगा, लेकिन यह बदसूरत लगता है - मैं सिर्फ यह कम भ्रामक बनाने के लिए myMethod(42, 2009) ऐसा करने के लिए, विशेष रूप से अन्य भाषाओं के लिए सक्षम होने के लिए करना चाहता था। क्या इसके लिए कोई बेहतर कामकाज है?

धन्यवाद।

उत्तर

0

वर्गार्स को संकलक द्वारा ऑब्जेक्ट के रूप में संभाला जाता है [] जो त्रुटि संदेश का वर्णन करता है।

मेरे पास JRuby अनुभव नहीं है, लेकिन यदि आपके पास सरणी तर्क है तो यह काम करता है?

2

जावा आंतरिक रूप से परिवर्तनीय-लंबाई तर्क सूची को एक सरणी के रूप में मानता है जिसका तत्व सभी एक ही प्रकार के होते हैं। यही कारण है कि आपको अपनी जेआरबी स्क्रिप्ट में ऑब्जेक्ट्स की एक सरणी प्रदान करने की आवश्यकता है।

यह इस तरह काम करता है:

myMethod [42, 2009].to_java 

to_java विधि एक रूबी सरणी से एक जावा सरणी निर्माण करती है। डिफ़ॉल्ट रूप से, to_java इस मामले में आवश्यक ऑब्जेक्ट एरे बनाता है। JRuby -rjava -e 'fmt = java.util.Formatter.new) (;: यदि आप एक स्ट्रिंग सरणी की जरूरत है आप JRuby wiki

+0

पर एक और उदाहरण इस पर

["a","b","c"].to_java(:string) 

अधिक प्रयोग करेंगे fmt.format डालता है ("|% 4s |", ["üü"]। to_java) ' – reto

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