2012-05-01 5 views
5

के साथ इंटरफेसिंग करते समय स्पष्ट रूप से क्लोजर में कैसे डाला जाए, क्लोजर से वेका का उपयोग करने की कोशिश में, मैं क्लोजर की जावा इंटरऑप सुविधाओं का उपयोग करके वेका विकी से क्लोजर में this howto guide को परिवर्तित करने की कोशिश कर रहा हूं।जावा

यह अब तक अच्छी तरह से काम किया है एक मामले में, जहां clojure प्रतिबिंब तंत्र को लागू करने की सही विधि को खोजने के लिए नहीं कर पा रहे छोड़कर, - मेरे पास है:

(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set))) 

बाद में इस से सक्रिय किया जाएगा Evaluation वर्ग के .evaluateModel विधि:

(.evaluateModel e-test c-model is-testing-set) 

जहां e-test प्रकार weka.classifiers.Evaluation की है और, their api documentation के अनुसार विधि प्रकारके दो पैरामीटर लेता हैऔर Instances

क्या मैं clojure से मिलता है, हालांकि IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) है - मुझे लगता है कि है कि इस वजह से c-model प्रकार NaiveBayes की वास्तव में है, हालांकि यह भी एक Classifier होना चाहिए - जो भी हो, instance? के अनुसार।

मैंने cast के साथ कास्टिंग करने की कोशिश की, और जो भी मैं समझता हूं उससे क्लोजर में वास्तविक कलाकारों की तुलना में यह एक प्रकार का दावा (और बिना किसी समस्या के गुजरता है) से अधिक है। जावा इंटरऑप विधि कॉल में किस प्रकार कास्ट करना है, स्पष्ट रूप से क्लोजर कहने का एक और तरीका है? (ध्यान दें कि मूल गाइड मैं ऊपर लिंक भी Classifier करने के लिए NaiveBayes से एक स्पष्ट डाली उपयोग करता है)

पूर्ण यहाँ कोड: /http://paste.lisp.org/display/129250

उत्तर

6

जुड़ा हुआ जावाडोक अपने दावे के लिए एक विधि एक वर्गीकरणकर्ता और एक उदाहरण ले जा रहा है कि वहाँ के विपरीत है - वहाँ क्या है, एक विधि एक वर्गीकरणकर्ता ले रहा है, एक उदाहरण, और ऑब्जेक्ट्स की एक चर संख्या। जैसा कि कई SO प्रश्नों में चर्चा की गई है (जिसमें से केवल एक ही समय में मैं पा सकता हूं Why Is String Formatting Causing a Casting Exception? है), क्लोजर वैरगास के लिए निहित समर्थन प्रदान नहीं करता है, जो मूल रूप से javac कंपाइलर द्वारा बनाई गई फ़िक्शन हैं। JVM स्तर पर, यह ऑब्जेक्ट [] प्रकार का एक अतिरिक्त आवश्यक पैरामीटर है। यदि आप अपनी विधि में एक तीसरा पैरामीटर, खाली ऑब्जेक्ट-सरणी पास करते हैं, तो यह ठीक काम करेगा।

+0

मैं सोच रहा था कि एक सेकंड के लिए varargs के साथ क्या करना है, लेकिन उस जवाब में नहीं आया - धन्यवाद! –

2

IllegalArgumentException No matching method found किसी भी समय होता है बहस कक्षा से मेल नहीं खाते। वे मिलान करने में विफल हो सकते हैं क्योंकि उस नाम और तर्कों की संख्या के साथ कोई विधि मौजूद नहीं है या क्योंकि उस नाम के साथ बुलाया वर्ग में कोई विधि मौजूद नहीं है। इसलिए तर्कों की संख्या और प्रकार भी देखें।

मैं मूल रूप से हमेशा इन मामलों

में repl-utils/शो का सहारा
+0

कि तर्क जो मेल नहीं खाते हैं वह है जो मैंने पाया है, बात यह है कि मैंने पहले से ही 'उदाहरण' के साथ अपने प्रकार की जांच की है और यह सब मुझे चाहिए - केवल दुभाषिया विधि आमंत्रण पर कुछ और करता है :(संबंधित प्रतिलिपि-उपयोग/शो: मुझे क्लोजर-contrib' लाइब्रेरी (संस्करण 1.2) का उपयोग करते हुए चेतावनियों का एक गुच्छा मिलता है जो मैंने clojars.org पर पाया और शो फ़ंक्शन एक त्रुटि फेंकता है - ऐसा लगता है कि ऐसा नहीं लगता है क्लोजर 1.4 –

+2

क्लोजर 1.3 और उच्चतम में, टेक्स्ट-आधारित 'शो' को डेटा-संचालित फ़ंक्शन' clojure.reflect/reflect' द्वारा प्रतिस्थापित किया गया है। – amalloy