java - 与java交互时如何在clojure中显式转换

标签 java clojure interop variadic-functions

在尝试使用 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该方法采用 ClassifierInstances

类型的两个参数

我从 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 互操作方法调用中要转换为哪些类型? (请注意,我上面链接的原始指南也使用了从 NaiveBayesClassifier 的显式转换)

完整代码在这里:/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/

相关文章:

java - Android 动态语言编程入门((J)Ruby、Clojure...)

c# - 如何在C#中实例化堆中的结构

C# Com 互操作 : Set Background Colour Of A Row

c# - C# 什么时候释放 C++ DLL?

java - 如何为字符串创建正则表达式以匹配 [@username :4]?

java - 不同类型的对象传递

Clojure:向量加法的可变参数函数

java - 试图在 Java 中获取选项字段的值

java - 代码交换

clojure - 如何在 Clojure 中编写 monoid 协议(protocol)?