clojure gen-class生成的类调用问题

时间:2013-09-02 14:47:23

标签: clojure gen-class

我定义了以下MyCache.clj

(ns abcd.MyCache
  (:gen-class
   :name "abcd.MyCache"
   :init "init"
   :constructors { [java.text.DateFormat][] }
   :methods [ [now [] void] [myformat [long] String] ]
   :state "state"
   :main false))

(defn -init[format]
  ([[] (atom {:format format})]))



(defn -now[this] ( (:format @(.state this)) (System/currentTimeMillis)))

(defn -myformat[this time]
    ( (:format @(.state this) (new java.util.Date time))))

我成功使用(编译'abcd.MyCache)编译了上面的文件。

当我尝试使用生成的类时,如下所示。我收到错误。请帮忙。

user=> (new abcd.MyCache (new java.text.SimpleDateFormat "mmDDyyyy"))
IllegalArgumentException Key must be integer  clojure.lang.APersistentVector.invoke (APersistentVector.java:265)

1 个答案:

答案 0 :(得分:1)

我对此并不满意:

(defn -init[format]
  ([] [atom {:format format}]))

您正在尝试从向量中获取元素,并且它需要索引(数字)。

正确的是对原子进行deref并将其值作为向量的索引。但在你的情况下,你正试图查询一个空的向量。

另请注意,[atom {:format format}]不是创建原子的正确方法。你应该使用:

(atom {:format format})

顺便说一句,以下表单是创建Java对象的首选表单(当然没有任何问题):

(Date.)
(DateFormat.)