`
(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用由仪器化函数替换var值,这些函数不会与原始功能接口一起工作
方法: 考虑原始接口,使它们一起工作,或者记录/失败表示仪器化将无法与这些一起工作。