我运行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。我怎样才能做到这一点?
答案 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
返回this
,hm.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。