`
(require '[clojure.spec :as s] '[clojure.spec.test :as st])
(defn foo [^double val] val)
(s/fdef foo :args (s/cat :val double?))
(st/instrument `foo)
(foo 5.2)
user=> (foo 5.2)
ClassCastException clojure.spec.test$spec_checking_fn$fn__13069 cannot be cast to clojure.lang.IFn$DO
user/eval6 (NO_SOURCE_FILE:5)
user/eval6 (NO_SOURCE_FILE:5)
clojure.lang.Compiler.eval (Compiler.java:6951)
clojure.lang.Compiler.eval (Compiler.java:6914)
clojure.core/eval (core.clj:3187)
clojure.core/eval (core.clj:3183)
clojure.main/repl/read-eval-print--9704/fn--9707 (main.clj:241)
clojure.main/repl/read-eval-print--9704 (main.clj:241)
clojure.main/repl/fn--9713 (main.clj:259)
clojure.main/repl (main.clj:259)
clojure.main/repl-opt (main.clj:323)
clojure.main/main (main.clj:422)
`
原因:spec用仪表化函数替换var值,这些仪表化函数不适用于原始函数接口
方法:考虑原始接口并使其工作,或者记录/失败说明仪表化不适用这些函数。