2012-05-01 9 views
5

Beim Versuchen, weka von clojure zu benutzen, versuche ich this howto guide vom weka Wiki zu konvertieren, um mit den Java-Interopeigenschaften von clojure zu clojure.Wie man explizit in clojure wirft, wenn es mit java verbindet

Das hat bisher gut gearbeitet, außer in einem Fall, in dem der clojure Reflexionsmechanismus nicht aufrufen kann scheinen die richtige Methode zu finden - ich habe:

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

diese werden später durch die aufgerufen werden, .evaluateModel Verfahren der Evaluation Klasse:

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

wo e-test vom Typ weka.classifiers.Evaluation und nach their api documentation das Verfahren hat zwei Parameter der Typenobwohlund Instances

Was ich von clojure bekommen ist IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - Ich denke, dass dies, weil c-model tatsächlich vom Typ NaiveBayes, obwohl es auch ein Classifier sein sollte - was es ist, nach instance?.

Ich versuchte Casting mit cast ohne Erfolg, und von dem, was ich verstehe, ist dies eher eine Art Behauptung (und geht ohne Probleme natürlich) als eine echte Besetzung in clojure. Gibt es eine andere Möglichkeit, clojure explizit anzugeben, welche Typen in Java-Interop-Methodenaufrufen umgewandelt werden sollen? (Beachten Sie, dass die ursprüngliche Anleitung, die ich oben auch eine explizite Umwandlung NaiveBayes-Classifier verwendet verknüpft)

Voll Code hier: /http://paste.lisp.org/display/129250

Antwort

6

Die verlinkte javadoc widerspricht Ihrer Forderung, dass ein Verfahren gibt es eine Classifier und eine Instanzen nehmen - was es ist, ein Verfahren ist ein Classifier nehmen, ein Instanzen, und eine variable Anzahl von Objekten. Wie in einer Reihe von SO-Fragen diskutiert (die einzige, die ich im Moment finden kann ist Why Is String Formatting Causing a Casting Exception?), Clojure bietet keine implizite Unterstützung für Varargs, die im Grunde sind Fiktionen von der javac Compiler erstellt. Auf der JVM-Ebene ist es einfach ein zusätzlicher erforderlicher Parameter vom Typ Object []. Wenn Sie einen dritten Parameter, ein leeres Objekt-Array, an Ihre Methode übergeben, wird es funktionieren.

+0

Ich fragte mich, was ich mit den varargs machen sollte, aber diese Antwort ist mir nicht gekommen - danke! –

2

IllegalArgumentException No matching method found jederzeit geschieht die Argumente Passen Sie nicht zur Klasse. Sie können nicht übereinstimmen, weil keine Methode mit diesem Namen und dieser Anzahl von Argumenten existiert oder weil keine Methode mit diesem Namen in der aufgerufenen Klasse existiert. Überprüfen Sie auch die Anzahl und den Typ der Argumente.

ich im Grunde immer zurückgreifen zu repl-utils/show in diesen Fällen

+0

dass die Argumente nicht übereinstimmen ist was ich auch gefunden habe, die Sache ist, ich habe bereits ihren Typ mit 'instance?' Überprüft und das tut alles was ich will - nur der Interpreter macht etwas anderes beim Methodenaufruf :(In Anbetracht repl-utils/show: Ich bekomme eine Reihe von Warnungen, wenn ich die 'clojure-contrib'-Bibliothek (Version 1.2), die ich auf clojars.org gefunden habe, benutze und die show-Funktion einen Fehler erzeugt - es scheint nicht zu spielen gut mit clojure 1.4 –

+2

In clojure 1.3 und höher wurde die textbasierte 'show' durch die datengesteuerte Funktion' clojure.reflect/reflect' ersetzt. – amalloy