3
(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' 参数,但它没有帮助。这段代码有什么问题?

4

2 回答 2

2

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

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

它必须成为

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

否则你只会在你的编译类中得到一个 1-arity 方法。

于 2012-06-20T11:04:43.920 回答
0

所以问题出在

Java.util.HashMap

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

于 2012-06-20T11:59:00.687 回答