【问题标题】:How to cast explicitly in clojure when interfacing with java与java交互时如何在clojure中显式转换
【发布时间】:2012-05-01 18:52:43
【问题描述】:

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

到目前为止,这一切都很好,除了在一种情况下,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

【问题讨论】:

    标签: java clojure interop variadic-functions


    【解决方案1】:

    链接的 javadoc 与您声称有一个采用分类器和一个实例的方法相矛盾 - 有一个方法采用一个分类器、一个实例、和可变数量的对象。正如在一些 SO 问题中所讨论的(目前我能找到的唯一一个是 Why Is String Formatting Causing a Casting Exception?),Clojure 不提供对 varargs 的隐式支持,这基本上是由 javac 编译器创建的虚构。在 JVM 级别,它只是 Object[] 类型的附加必需参数。如果您将第三个参数(一个空的对象数组)传递给您的方法,它将正常工作。

    【讨论】:

    • 我想知道如何处理可变参数,但没有找到答案 - 谢谢!
    【解决方案2】:

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

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

    【讨论】:

    • 我也发现参数不匹配,问题是我已经用instance?检查了它们的类型,这就是我想要的——只有解释器在方法上做了其他事情调用:(关于repl-utils/show:当useing clojure-contrib 库(1.2 版)我在clojars.org 上找到并且show 函数抛出错误时,我收到一堆警告- 似乎没有与 clojure 1.4 配合得很好
    • 在 clojure 1.3 及更高版本中,基于文本的 show 已被数据驱动的函数 clojure.reflect/reflect 取代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2011-01-25
    • 2011-04-18
    • 2013-02-13
    相关资源
    最近更新 更多