6

在尝试使用 clojure 中的 weka 时,我正在尝试使用 clojure 的 java 互操作功能将this howto guide从 weka wiki 转换为 clojure。

到目前为止,这一直运作良好,除了在一种情况下,clojure 反射机制似乎无法找到正确的调用方法 - 我有:

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

稍后这将由类的.evaluateModel方法调用Evaluation

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

wheree-test是类型weka.classifiers.Evaluation,根据他们的 api 文档,该方法采用两个类型参数ClassifierInstances

不过,我从 clojure 得到的是IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)- 我猜这是因为c-model它实际上是 type NaiveBayes,尽管它也应该是Classifier- 根据instance?.

我尝试强制转换cast无济于事,据我了解,这更像是一种类型断言(当然,通过没有问题),而不是在 clojure 中进行真正的强制转换。是否有另一种方法可以明确告诉 clojure 在 java 互操作方法调用中要转换为哪些类型?(请注意,我上面链接的原始指南也使用了从NaiveBayesto的显式转换Classifier

完整代码在这里:/http://paste.lisp.org/display/129250

4

2 回答 2

7

链接的 javadoc 与您声称有一个采用 Classifier 和一个 Instances 的方法相矛盾 - 有一个采用 Classifier、一个 Instances和可变数量的 Objects 的方法。正如在许多 SO 问题中所讨论的(目前我能找到的唯一一个是为什么字符串格式化会导致强制转换异常?),Clojure 不提供对可变参数的隐式支持,可变参数基本上是javac编译器创建的虚构。在 JVM 级别,它只是 Object[] 类型的附加必需参数。如果您将第三个参数(一个空的对象数组)传递给您的方法,它将正常工作。

于 2012-05-02T07:46:15.080 回答
2

IllegalArgumentException No matching method found任何时候参数与类不匹配时都会发生。它们可能无法匹配,因为不存在具有该名称和参数数量的方法,或者因为在被调用的类中不存在具有该名称的方法。所以还要检查参数的数量和类型。

在这些情况下,我基本上总是求助于 repl-utils/show

于 2012-05-01T19:08:34.293 回答