Clojure 中的方法值本身就是值。它是创建使用 Java 方法适当重载的 lambda 函数的语法糖。
Java 中的方法引用是为在特定上下文中创建正确对象而设置的语法糖。你不能简单地获取 LocalDate::from
的值 - 你必须将其放入 Java 编译器能够理解你确切想要什么的上下文中。
你的例子更像是 Java,而不是 Clojure。Java 编译器负责解析所有签名,并且它们是兼容的,这使得可以使用 ...::from
的方式。
由于你只是在调用 parse
函数,因此使用 when 没有意义,而不是可以使用的
(^[CharSequence TemporalQuery] DateTimeFormatter/parse formatter x y)
when instead you can use
(.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)))))