定义multimethod IllegalArgumentException无匹配方法:addMethod

时间:2016-07-02 17:45:42

标签: clojure

我正在尝试使用Clojure编写用于执行dns查找的命名空间,并且我遇到了一个奇怪的问题。以下代码按预期编译和工作。

(ns dmarced.dns)

(defmulti lookup-record
  (fn [type name]
    type))

(defmethod lookup-record :txt [_ name]
  [["foo"]])

另一方面,如果我想这样命名方法lookup

(ns dmarced.dns)

(defmulti lookup
  (fn [type name]
    type))

(defmethod lookup :txt [_ name]
  [["foo"]])

它不会编译。我得到的错误是

Exception in thread "main" java.lang.IllegalArgumentException: No matching method: addMethod, compiling:(dmarced/dns.clj:7:1)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6875)
    at clojure.lang.Compiler.analyze(Compiler.java:6669)
    at clojure.lang.Compiler.analyze(Compiler.java:6625)
    at clojure.lang.Compiler$BodyExpr$Parser.parse(Compiler.java:6001)
    at clojure.lang.Compiler$FnMethod.parse(Compiler.java:5380)
    at clojure.lang.Compiler$FnExpr.parse(Compiler.java:3972)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6866)
    at clojure.lang.Compiler.analyze(Compiler.java:6669)
    at clojure.lang.Compiler.eval(Compiler.java:6924)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    at clojure.lang.RT.loadResourceScript(RT.java:372)
    at clojure.lang.RT.loadResourceScript(RT.java:363)
    at clojure.lang.RT.load(RT.java:453)
    at clojure.lang.RT.load(RT.java:419)
    at clojure.core$load$fn__5677.invoke(core.clj:5893)
    at clojure.core$load.invokeStatic(core.clj:5892)
    at clojure.core$load.doInvoke(core.clj:5876)
    at clojure.lang.RestFn.invoke(RestFn.java:408)
    at user$eval5$fn__16.invoke(form-init1251542249642636935.clj:1)
    at user$eval5.invokeStatic(form-init1251542249642636935.clj:1)
    at user$eval5.invoke(form-init1251542249642636935.clj:1)
    at clojure.lang.Compiler.eval(Compiler.java:6927)
    at clojure.lang.Compiler.eval(Compiler.java:6917)
    at clojure.lang.Compiler.load(Compiler.java:7379)
    at clojure.lang.Compiler.loadFile(Compiler.java:7317)
    at clojure.main$load_script.invokeStatic(main.clj:275)
    at clojure.main$init_opt.invokeStatic(main.clj:277)
    at clojure.main$init_opt.invoke(main.clj:277)
    at clojure.main$initialize.invokeStatic(main.clj:308)
    at clojure.main$null_opt.invokeStatic(main.clj:342)
    at clojure.main$null_opt.invoke(main.clj:339)
    at clojure.main$main.invokeStatic(main.clj:421)
    at clojure.main$main.doInvoke(main.clj:384)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)
Caused by: java.lang.IllegalArgumentException: No matching method: addMethod
    at clojure.lang.Compiler$StaticMethodExpr.<init>(Compiler.java:1642)
    at clojure.lang.Compiler$HostExpr$Parser.parse(Compiler.java:1011)
    at clojure.lang.Compiler.analyzeSeq(Compiler.java:6868)
    ... 37 more
Failed.

感觉这应该是简单的事情,但我没有看到它。我已经检查过,lookup似乎没有在其他地方定义。

使用Clojure 1.8.0

编辑:noisesmith指出它在香草Clojure项目中运作良好。一些实验告诉我,如果我删除对[dnsjava/dnsjava "2.1.7"]的依赖性,问题就会消失,但我仍然不明白它为什么会在第一时间发生。

0 个答案:

没有答案