将其包裹在一个处理您提示的函数中。然后使用该函数而不是直接使用解引用...
user> (set! *warn-on-reflection* true)
true
user> (def the-ref (delay (java.util.HashMap. )))
#'user/the-ref
user> (defn realize-map ^java.util.HashMap [some-ref]
@some-ref)
#'user/realize-map
user> (doto (realize-map the-ref) (.put :a 2))
{:a 2}
您可以使用协议(或多种方法)进行泛化。这里有一个协议变体...
(defprotocol IMapthing
(retrieve [this arg])
(insert [this k v]))
(extend-protocol IMapthing
clojure.lang.Delay
(retrieve [this k] (retrieve @this k))
(insert [this k v] (do (insert @this k v) this))
java.util.HashMap
(retrieve [this k] (.get this k))
(insert [this k v ] (.put this k v)))
user> (def the-delay (delay (java.util.HashMap.)))
#'user/the-delay
user> (insert the-delay :a 2)
#<Delay@2ae7ca5b: {:a 2}>
user> (retrieve the-delay :a)
2
还有其他方案,但这些对我来说是最不侵入性的。