考虑以下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静态函数不起作用?
你的前两个陈述实际上并不相同.当你说...
(def space? Character/isWhitespace)
Run Code Online (Sandbox Code Playgroud)
... Clojure是试图寻找一个静态字段名为(未法)isWhitespace在java.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方法添加别名,您必须明确说明您正在使用别名的方法/字段.