Yef*_*itz 6 java interop clojure variadic-functions
在试图使用来自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
链接的javadoc与你声称有一种方法采用分类器和实例相矛盾 - 这是一种采用分类器,实例和可变数量的对象的方法.正如在许多SO问题中所讨论的那样(目前我能找到的唯一一个问题是为什么字符串格式化导致了一个转换异常?),Clojure没有为varargs提供隐式支持,这些基本上是由javac编译器创建的小说.在JVM级别,它只是Object []类型的附加必需参数.如果将第三个参数(空对象数组)传递给方法,它将正常工作.