我试图在 Clojure 1.4 中使用原始参数定义一个协议(这样我就可以避免在性能敏感代码中不必要的原始装箱):
(defprotocol A
(foo [a ^long x]))
(extend-type java.lang.String A
(foo [s ^long x] (.charAt s x)))
这看起来工作正常,但当我尝试使用它时失败并出现异常:
(foo "abracadarbra" 3)
=> ClassCastException XXXX cannot be cast to clojure.lang.IFn$OLO
我究竟做错了什么?