在 Clojure 中,方法值本身就是值。这是创建一个使用 Java 方法正确重载的 lambda 函数的语法糖。
在 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 编译器,但我可能错了。)
综上所述,我 pretty sure 随着目前的状况,您要实现您想要的功能的唯一方法是使用古老的 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)))))