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)))))