【问题标题】:Creating clojure library(jar) in order to call it from java创建 clojure 库(jar)以便从 java 调用它
【发布时间】:2012-06-20 10:27:10
【问题描述】:
(ns lol.test
  (:gen-class
   :name lol.test
   :methods [[createHashMap [String] Java.util.HashMap]])
  (:import [java.util HashMap]))

(defn -createHashMap [this s]
  (HashMap. (assoc {} s "test")))

我正在尝试从 java 调用 clojure 函数,为此我创建了这个文件,它可以完美地用 lein 编译,我通过调用“lein uberjar”来创建一个 jar 文件。

现在的问题是,当我像这样从 java 调用它时:

lol.test l = new lol.test();
l.createhashMap("test");

它抛出一个 ArityException

Wrong number of args (2) passed to

我尝试从 clojure 代码中删除“this”参数,但没有帮助。这段代码有什么问题?

【问题讨论】:

  • 您的返回类型是什么?应该是java.util.HashMap

标签: java clojure


【解决方案1】:

您需要修复 :methods 声明。现在你有

:methods [[createHashMap [String] java.util.HashMap]]

它必须变成

:methods [[createHashMap [Test String] java.util.HashMap]]

否则,您在编译的类中只会获得 1 元方法。

【讨论】:

  • Java.util.HashMapjava.util.HashMap ..?
  • 无论如何,为什么我们需要在方法参数中进行测试?没有它,它应该可以工作..?
【解决方案2】:

所以问题出在

Java.util.HashMap

java 应该从小写字母开始。但更大的问题是 clojure lib 不想将 java.util.HashMap 作为对象返回。解决方法是序列化,然后返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多