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 アリティのメソッドしか取得できません。

于 2012-06-20T11:04:43.920 に答える
0

だから問題は

Java.util.HashMap

java は小文字から始める必要があります。しかし、より大きな問題は、clojure lib が java.util.HashMap をオブジェクトとして返したくないということでした。解決策は、シリアル化してから返すことです。

于 2012-06-20T11:59:00.687 に答える