Clojure:为什么我不能在不调用它们的情况下引用类方法?

Bre*_*dan 1 lisp jvm clojure clojure-repl

这是一个 Clojure REPL 会话:

moon.core> Double
java.lang.Double
moon.core> (Double/parseDouble "1.0")
1.0
moon.core> Double/parseDouble
CompilerException java.lang.RuntimeException: Unable to find static field: parseDouble in class java.lang.Double, compiling:(*cider-repl moon*:1:7159) 
Run Code Online (Sandbox Code Playgroud)

我可以引用Double,也可以调用 Double/parseDouble,但不能直接引用。对于 Java 标准库中的其他类方法(例如Math/absInteger/parseInt),我看到了相同的结果。为什么?

Ale*_*ler 5

如果您想将静态 Java 方法转换为可以视为第一类事物的 Clojure 函数,您可以轻松地将一个函数包装在它周围:

(def pd #(Double/parseDouble %))
#'user/pd
(pd "1.0")
1.0
Run Code Online (Sandbox Code Playgroud)

memfn函数可用于对 Java 实例方法执行类似操作。