1

我定义了以下 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))))

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

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

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

1 回答 1

1

我对此感觉不太好:

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

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

正确的是取消引用原子并将其值作为向量的索引。但同样在您的情况下,您正在尝试查询一个空向量。

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

(atom {:format format})

顺便说一句,以下形式是创建 Java 对象的首选形式(当然,(新)没有错):

(Date.)
(DateFormat.)
于 2013-09-02T15:10:01.850 回答