Clojure 中的方法值本身是值。它是创建一个 lambda 函数的语法糖,该函数使用 Java 方法的正确重载。
Java 中的方法引用是创建用于特定上下文的正确事物的语法糖。你不能直接获取 LocalDate::from
的值 - 你必须将其放入 Java 编译器可以确定你确切要什么的环境中。
你的例子更多是关于 Java,而不是 Clojure。是 Java 编译器计算出所有签名,并发现它们是兼容的,使得可以使用 ...::from
的方式。
因为你只是调用了 parse
函数,所以使用 when
不是很合适
(^[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)))))