Пытаясь использовать weka из clojure, я пытаюсь преобразовать это практическое руководство из вики weka в clojure, используя java особенности взаимодействия clojure.
До сих пор это работало хорошо, за исключением одного случая, когда механизм отражения clojure не может найти правильный метод для вызова -У меня есть:
(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set)))
Позже это будет вызвано методом .evaluateModel
класса Evaluation
:
(.evaluateModel e-test c-model is-testing-set)
, где e-test
имеет тип weka.classifiers.Evaluation
и, согласно их документации API , метод принимает два параметра типов Classifier
и 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
безрезультатно, и насколько я понимаю это больше похоже на утверждение типа (и проходит без проблем, конечно ), чем реальное приведение в clojure. Есть ли другой способ явно указать clojure, к каким типам приводить вызовы методов взаимодействия java? (Обратите внимание, что исходное руководство, на которое я ссылался выше, также использует явное приведение от NaiveBayes
кClassifier
)
Полный код здесь :/http://paste.lisp.org/display/129250