我在命名空间x中定义了这个协议:
(ns x
(:require [..]))
(defrecord MyData [something something-else])
(defprotocol MyProtocol
(my-fn [data]))
现在我想在另一个命名空间中创建此协议的实现。我尝试过这样的事情:
(ns y
(:require [..])
(:import (x MyData MyProtocol)))
(extend-protocol MyProtocol
MyData
(my-fn [data]
; Do something with the data
))
然而,当我尝试像这样执行my-fn
时(来自我的测试用例):
(ns y-test
(:require [x :refer [MyData my-fn]]
[...]))
...
(let [data (->MyData ...)]
(my-fn data))
我得到以下异常:
java.lang.IllegalArgumentException: No implementation of method: :my-fn of protocol: #'x/MyProtocol found for class: x.MyData
如果我将MyProtocol
移到命名空间y
,它似乎可行。我错过了什么?
更新
在ayato_p的回答后,我需要协议(在y中)而不是导入它,但我仍然得到相同的错误。将extend-protocol
从y
移至x
可以解决问题。
答案 0 :(得分:1)
import
仅用于Java类,因此您无法通过MyProtocol
导入:import
。
以下代码适用于您的记录类型和协议。
(ns y
(:require [.. Myprotocol])
(:import (x MyData)))