如何在Java静态方法上获取clojure句柄,类似于_memfn_用于Java实例方法?

时间:2011-12-24 06:28:55

标签: clojure

要获得稍后我们可以调用的Java实例方法的句柄,我们可以调用 memfn 函数:

user=> (def g (memfn Integer/toString))
#'user/g

user=> (g 789)
"789"

这对Java静态方法不起作用:

user=> (def g (memfn Integer/toHexString))
#'user/g

user=> (g 789)
IllegalArgumentException No matching method found: toHexString for class java.lang.Long  clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:52)

user=> (g)
ArityException Wrong number of args (0) passed to: user$g  clojure.lang.AFn.throwArity (AFn.java:437)

我们如何获得Java静态方法的句柄,以便稍后我们可以调用它?

1 个答案:

答案 0 :(得分:7)

(defn g [x] (Integer/toHexString x)) ...?如果你愿意,你可以把它包装在宏中,但是没有什么可做的:

(defmacro static-fn [f] `(fn [x#] (~f x#)))
(def g (static-fn Integer/toHexString))