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编译器,但也许我错了。)
综上所述,我非常确定,在当前的状态下,唯一实现你想要的功能的方式是使用古老的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)))))