Clojure协议支持类型提示吗?

3

Clojure协议是否支持类型提示,以便可以像静态类型语言中一样重载具有相同参数(除了类型提示)的同名方法?

例如:

(defprotocol IFoo
  (get-val [this ^String astring])
  (get-val [this ^AClass aclass]))

如果不行,我能实现这个吗,还是必须重命名方法?

这个回答解决了你的问题吗?[使用具有原始参数的协议](https://dev59.com/rGfWa4cB1Zd3GeqPkMOF) - akond
由于协议仅在调度仅基于第一个参数的类型的情况下使用,因此它们似乎不适用于此用例,其中调度似乎基于多个参数的类型。正如@amalloy在评论中建议的那样,也许多态方法可能更合适。 - dorab
我尝试做的其中一件事情是在一个实现中重复使用另一个实现。我发现没有办法在不区分参数类型的情况下实现这一点,所以我想唯一的方法就是根据与类型相关联的函数来重新命名方法。 - HAA
1个回答

2
据我所知,你不能使用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]

1
这是正确的,但是 definterface 真正想要达成的目的只是为了互操作性,给 Java 代码提供一个调用方法的接口。(就我个人而言,即使在那种情况下,我也宁愿写几行 Java 代码)。对于 Clojure 内部的工作,只需使用 Clojure 的多分派方法之一,例如多方法。 - amalloy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接