如何在Lein项目中设置类?

时间:2013-07-31 16:22:21

标签: java class clojure

我运行lein new app hm,然后在hm/src/hm编辑core.clj中运行:

(ns hm.core
  (:gen-class)
  (:use [hm.hashmap]))

(defn -main []
  (def j (new hm.hashmap))
  (-add j "foo" "bar")
  (println j))

hashmap.clj

(ns hm.hashmap
  (:gen-class
   :methods [[hashmap [] java.util.HashMap]
             [add [String String]]]))

(defn -hashmap []
  (def h (new java.util.HashMap))
  h)

(defn -add [this key value]
  (. this put key value)
  this)

目标是围绕HashMap创建一个包装器,这样我就可以理解Clojure以及它与Java的关系。我对Clojure很新。但是,当我编译它时,我在hashmap.clj中得到了很多ClassNotFoundException。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

注意:这是您问题的直接答案。我不建议你这样学习Clojure。


您需要先编译您的类,然后才能运行它们。在你的project.clj中将它添加到地图中:

:aot [hm.hashmap]

然后你需要运行lein compile来编译类。您应该看到输出说hm.hashmap类已编译。之后运行lein run以调用hm.core中的“main”函数。

我删除了你的gen-class的:methods部分,因为你已经在下面定义了它们,这导致了奇怪的java.lang.,错误。您将遇到其他错误,但这应该足以让您通过此问题。

答案 1 :(得分:0)

您的代码还有其他一些问题,但此处的直接问题是add的签名不完整。您的add返回thishm.hashmap

要修复此问题,请更改签名以返回Object,或者通过其他编辑更改java.util.HashMap。如果你希望这个以其他方式编写,你还需要扩展而不是封装。

(ns hm.hashmap
  (:gen-class
   :extends java.util.HashMap
   :methods [[add [String String] java.util.HashMap]]))

最后更改-main中的core.clj以使用.add调用该方法,而不是尝试访问私有-add

...
(.add j "foo" "bar")
...

然后

lein clean
lein compile hm.core hm.hashmap
lein run

应该打印

#<hashmap {foo=bar}>

请注意,据我所知,由于符号解析的时间,您不能指定在签名中返回hm.hashmap。请参阅GC Issue 81: compile gen-class fail when class returns self