在尝试使用 clojure 中的 weka 时,我尝试转换 this howto guide从 weka wiki 到 clojure,使用 clojure 的 java 互操作特性。
到目前为止,这种方法运行良好,除了在一种情况下,clojure 反射机制似乎无法找到正确的方法来调用 - 我有:
(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set)))
稍后这将由 Evaluation
类的 .evaluateModel
方法调用:
(.evaluateModel e-test c-model is-testing-set)
其中 e-test
属于 weka.classifiers.Evaluation
类型,并且根据 their api documentation该方法采用 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
最佳答案
链接的 javadoc 与您声称有一个采用分类器和实例的方法相矛盾 - 实际上,是一个采用分类器、实例、和可变数量的对象的方法。正如许多 SO 问题中所讨论的(目前我能找到的唯一问题是 Why Is String Formatting Causing a Casting Exception? ),Clojure 不提供对可变参数的隐式支持,可变参数基本上是由 javac
创建的小说编译器。在 JVM 级别,它只是一个附加的 Object[] 类型的必需参数。如果您将第三个参数(一个空对象数组)传递到您的方法中,它将正常工作。
关于java - 与java交互时如何在clojure中显式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402636/