【问题标题】:Do Clojure Protocols Support Type Hints?Clojure 协议是否支持类型提示?
【发布时间】:2022-01-05 03:25:29
【问题描述】:

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

例如,

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

如果没有,我可以实现这个,还是我必须重命名方法?

【问题讨论】:

  • 这能回答你的问题吗? Using a protocol with primitive arguments
  • 由于协议适用于调度仅针对第一个参数的类型的情况,因此它们似乎不适合这种调度似乎针对多个参数的类型的用例。正如@amalloy 在评论中建议的那样,也许多方法可能更合适。
  • 嗯,我尝试做的一件事就是在另一个中重用一个的实现。我看到如果没有某种方法来区分参数类型是不可能的,所以我想唯一的事情就是根据与类型关联的函数重命名方法。

标签: clojure protocols


【解决方案1】:

Afaik,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 的一种调度方法,例如多方法。
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 2021-01-25
  • 2012-07-09
  • 2014-11-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多