Clojure协议是否支持类型提示,以便可以像静态类型语言中一样重载具有相同参数(除了类型提示)的同名方法?
例如:
(defprotocol IFoo
(get-val [this ^String astring])
(get-val [this ^AClass aclass]))
如果不行,我能实现这个吗,还是必须重命名方法?
Clojure协议是否支持类型提示,以便可以像静态类型语言中一样重载具有相同参数(除了类型提示)的同名方法?
例如:
(defprotocol IFoo
(get-val [this ^String astring])
(get-val [this ^AClass aclass]))
defprotocol
实现这一点,但可以通过definterface
来实现:(definterface Intf
(^String add [^String s])
(^long add [^long l]))
(defrecord Rec [^long data]
Intf
(^String add [self ^String s] (str data s))
(^long add [self ^long l] (+ data l)))
user> (let [r (Rec. 101)]
[(.add r "asd")
(.add r 200)])
;;=> ["101asd" 301]
definterface
真正想要达成的目的只是为了互操作性,给 Java 代码提供一个调用方法的接口。(就我个人而言,即使在那种情况下,我也宁愿写几行 Java 代码)。对于 Clojure 内部的工作,只需使用 Clojure 的多分派方法之一,例如多方法。 - amalloy