考虑以下 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!
这里发生了什么?为什么使用 Java 静态函数的 def
不起作用?
最佳答案
您的前两个陈述实际上并不等同。当你说...
(def space? Character/isWhitespace)
...Clojure 正在尝试在 java.lang.Character
中查找名为 isWhitespace
的静态字段(不是方法)。当然,不存在这样的字段,这就是您收到编译错误的原因。
重写以下语句的其他正确方法...
(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 方法添加别名,您必须明确您要为哪个方法/字段添加别名。
关于Clojure:def 到 Java 静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18581667/