[英]How do I set up classes in a Lein project?
我运行了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。 我该如何进行这项工作?
注意:这是您问题的直接答案。 我不建议您这样学习Clojure。
您需要先编译类,然后才能运行它们。 在您的project.clj中,将此添加到地图中:
:aot [hm.hashmap]
然后,您需要运行lein compile
才能编译类。 您应该看到输出说hm.hashmap
类已编译。 该运行后lein run
调用中的“主要”功能hm.core
。
我删除了gen-class的:methods
部分,因为您已经在下面定义它们了,这导致了奇怪的java.lang.,
错误。 您将遇到其他错误,但这足以使您通过此问题。
您的代码还有其他问题,但是直接的问题是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问题81:当class返回self时,编译gen-class失败 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.