Clojure中的方法值,本身就是值。这是创建一个使用Java方法恰当重载的lambda函数的语法糖。
Java中的方法引用是一个语法糖,用于在特定上下文中创建正确的东西。你不能只是获取LocalDate::from
的值 - 你必须将它放入Java编译器可以确定你确切想要什么的上下文中。
你的例子更像是Java,而不是Clojure。它是Java编译器解析所有签名并确定它们兼容,从而使得你可以以这种方式使用...::from
。
既然你只是调用parse
函数,使用而不是时没有多大意义。
(^[CharSequence TemporalQuery] DateTimeFormatter/parse formatter x y)
时
(.parse ^DateTimeFormatter formatter ^CharSequence x ^TemporalQuery y)
然而,这对于您的案例没有帮助,因为 LocalDate/from
不是 TemporalQuery
的实例。在 Clojure 中,LocalDate/from
是一个常规的 Clojure 函数。即使您使用 ^[TemporalAccessor] LocalDate/from
,它仍然是一个常规的 Clojure 函数,仅仅指向 那个 .../from
方法(这里不重要,因为 LocalDate
中只有一个这样的方法,但当存在重载时则很重要)。该函数的签名仍然是 [Object]
。(即使签名是 [TemporalQuery]
,我怀疑这也不会有帮助,因为在没有调用 Java 编译器的情况下,但我可能错了。)
综上所述,我非常确信,在目前的状况下,要实现您想要的功能,唯一的方法还是通过老式的 reify
(let [formatter java.time.format.DateTimeFormatter/BASIC_ISO_DATE]
(.parse formatter
"20200202"
(reify java.time.temporal.TemporalQuery
(queryFrom [_ ^java.time.temporal.TemporalAccessor temporal]
(java.time.LocalDate/from temporal)))))