Clojure:def到Java静态函数

时间:2013-09-02 22:39:43

标签: clojure

考虑以下Clojure代码:

(defn space? [c] (Character/isWhitespace c))

没关系。但显然,这只是另一种无名风格的名称和重构:

(def space? Character/isWhitespace)

但是我收到了编译错误:

Caused by: java.lang.RuntimeException: Unable to find static field: isWhitespace 
in class java.lang.Character

为什么找不到它?它与Clojure函数完美配合:

(def wrap-space? space?) ; Compiles OK!

这里发生了什么?为什么def使用Java静态函数不起作用?

1 个答案:

答案 0 :(得分:7)

你的前两个陈述实际上并不相同。当你说...

(def space? Character/isWhitespace)

... Clojure正试图在isWhitespace中寻找名为java.lang.Character的静态字段(非方法)。当然,不存在这样的字段,这就是你得到编译错误的原因。

重写以下声明的其他正确方法......

(defn space? [c] (Character/isWhitespace c))

......将是:

  • (def space? (fn [c] (Character/isWhitespace c)))
  • (defn space? [c] (. Character isWhitespace c))

修改

只是添加,我想Clojure允许(def wrap-space? space?)的原因是因为space?是什么没有歧义。另一方面,静态Java方法可能会使用不同的参数集重载,或者可能与静态字段共享相同的名称。因此,要为静态Java方法添加别名,您必须明确说明您正在使用别名的方法/字段。