2024 年 Clojure 状态调查中分享您的想法!

欢迎!请参阅 关于 页面以获取更多关于此工作的信息。

0
Java 互操作性

在某些情况下,我会得到一个返回 Java 对象的延迟(delay)或未来(future)。在这些情况下,似乎您只能从调用位置类型提示解引用操作的返回值。

(.reflectionAvoided ^SomeObj @some-delayed-java-object)

是否可以在定义位置类型提示它?如果不是,这会不会是一个合理的功能请求?

(def some-delayed-java-object
  (delay (SomeObj.)))

(.someReflectionNeedingMethod @some-delayed-java-object)

谢谢

1 答案

+2

编辑

将其包裹在一个处理您提示的函数中。然后使用该函数而不是直接使用解引用...

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

还有其他方案,但这些对我来说是最不侵入性的。

...