在试图使用来自clojure的weka时,我试图使用clojure的java互操作特性将这个howto指南从weka wiki 转换为clojure.
到目前为止,这种方法运作良好,除了在一种情况下,clojure反射机制似乎无法找到正确的调用方法 - 我有:
(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set)))
Run Code Online (Sandbox Code Playgroud)
稍后这将由类的.evaluateModel
方法调用Evaluation
:
(.evaluateModel e-test c-model is-testing-set)
Run Code Online (Sandbox Code Playgroud)
where 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在java互操作方法调用中要转换哪些类型?(请注意,我上面链接的原始指南也使用了来自的显式强制NaiveBayes
转换Classifier
)
完整代码在这里:/ http://paste.lisp.org/display/129250