`
(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 无法转换为 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 用 instrumented 函数替换 var 值,这些函数与原始的函数接口不兼容
方法:考虑原始接口并使其正常工作,或者在文档中说明/instrumentation 不能与这些函数一起工作。