在Clojure 1.2中:
(defprotocol PP
(foo [bar])
(foo [bar baz]))
=> PP
(extend-protocol PP
Object
(foo [bar] 1)
(foo [bar baz] 2))
=> nil
(foo "hello!")
=> #<CompilerException java.lang.IllegalArgumentException: No single method: foo of interface: PP found for function: foo of protocol: PP
我哪里错了?我希望看到1作为foo函数的单参数版本的结果,因为“你好!”显然是java.lang.Object的一个实例。
答案 0 :(得分:33)
我认为你协议中的第二个foo
正在破坏第一个user> (defprotocol PP
(foo [bar] [bar baz]))
PP
user> (extend-protocol PP
Object
(foo
([bar] 1)
([bar baz] 2)))
nil
user> (foo "foo")
1
user> (foo "foo" "bar")
2
。 arity上的重载与您使用的语法略有不同。
{{1}}