`
(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值,这些函数不会与原始函数接口一起工作
方法:考虑原始接口,并使其工作,或记录/失败,仪表化在这种情况下不会工作。