2012-05-01 7 views
5

Al tratar de usar weka de clojure, intento convertir this howto guide de la wiki de weka a clojure usando las funciones de interoperabilidad de java de clojure.Cómo lanzar explícitamente en clojure cuando interactúas con java

Esto ha funcionado bien hasta ahora, excepto en un caso, en que parece que no puede el mecanismo clojure reflexión para encontrar el método adecuado para invocar - Tengo:

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

Más tarde esto será invocado por el .evaluateModel método de la clase Evaluation:

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

donde e-test es de tipo weka.classifiers.Evaluation y, según their api documentation el método toma dos parámetros de tipos Classifier y Instances

Lo que recibo de clojure aunque es IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53) - Supongo que esto se debe c-model es en realidad el tipo de NaiveBayes, aunque también debe ser un Classifier - la cual es, según instance?.

He intentado fundir con cast en vano, y por lo que entiendo esto es más una afirmación de tipo (y pasa sin problemas, por supuesto) que un molde real en clojure. ¿Hay alguna otra manera de decirle explícitamente a Clojure a qué tipos enviar en las llamadas al método de interoperabilidad java? (Tenga en cuenta que la guía original, he vinculado anteriormente también utiliza una conversión explícita NaiveBayes-Classifier)

código completo aquí: /http://paste.lisp.org/display/129250

Respuesta

6

el Javadoc ligado contradice su afirmación de que no es un método de tomar un clasificador y un Instancias - lo que hay, es un método que toma un clasificador, a Instances, y una cantidad variable de objetos. Como se discutió en varias preguntas de SO (la única de las cuales puedo encontrar en este momento es Why Is String Formatting Causing a Casting Exception?), Clojure no proporciona soporte implícito para varargs, que son básicamente ficciones creadas por el compilador javac. En el nivel JVM, es simplemente un parámetro requerido adicional de tipo Object []. Si pasa un tercer parámetro, una matriz de objetos vacía, a su método, funcionará bien.

+0

me preguntaba qué hacer con los varargs por un segundo, pero no encontré esa respuesta, ¡gracias! –

2

IllegalArgumentException No matching method found sucede en cualquier momento los argumentos no coincide con la clase. No pueden coincidir porque no existe un método con ese nombre y la cantidad de argumentos o porque no existe un método con ese nombre en la clase llamada. así que también verifique el número y tipo de argumentos.

Yo, básicamente, siempre recurro a repl-utils/espectáculo en estos casos

+0

que los argumentos no coinciden es lo que también he encontrado, la cosa es que ya he comprobado su tipo con 'instance?' Y eso hace todo lo que quiero, solo el intérprete hace algo más en la invocación del método :(repl-utils/show: recibo un montón de advertencias cuando 'uso' la librería' clojure-contrib' (versión 1.2) que encontré en clojars.org y la función show arroja un error, parece que no funciona bien con clojure 1.4 –

+2

En clojure 1.3 y superior, el 'show' basado en texto ha sido reemplazado por la función basada en datos' clojure.reflect/reflect'. – amalloy

Cuestiones relacionadas