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

时间:2016-11-20 19:02:16

标签: clojure jvm lisp 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) 

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

2 个答案:

答案 0 :(得分:4)

如果你想将一个静态Java方法变成一个可以作为第一类东西处理的Clojure函数,你可以轻松地将一个函数包装起来:

(def pd #(Double/parseDouble %))
#'user/pd
(pd "1.0")
1.0

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

答案 1 :(得分:3)

这不起作用(在REPL中或其他方式),因为parseDouble类上没有名为Double的静态字段parseDouble是一种方法。您可以调用它,但不能像字段一样访问它。