Clojure:def到Java静态函数

dem*_*emi 4 clojure

考虑以下Clojure代码:

(defn space? [c] (Character/isWhitespace c))
Run Code Online (Sandbox Code Playgroud)

没关系.但显然,这只是无意义风格的另一个名称和重构:

(def space? Character/isWhitespace)
Run Code Online (Sandbox Code Playgroud)

但我得到编译错误:

Caused by: java.lang.RuntimeException: Unable to find static field: isWhitespace 
in class java.lang.Character
Run Code Online (Sandbox Code Playgroud)

为什么找不到它?它与Clojure功能完美配合:

(def wrap-space? space?) ; Compiles OK!
Run Code Online (Sandbox Code Playgroud)

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

Man*_*qui 7

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

(def space? Character/isWhitespace)
Run Code Online (Sandbox Code Playgroud)

... Clojure是试图寻找一个静态字段名为(未法)isWhitespacejava.lang.Character.当然,不存在这样的字段,这就是你得到编译错误的原因.

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

(defn space? [c] (Character/isWhitespace c))
Run Code Online (Sandbox Code Playgroud)

...将会:

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

编辑

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