扩展Clojure中另一个命名空间中定义的协议?

时间:2016-03-21 13:37:00

标签: clojure

我在命名空间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-protocoly移至x可以解决问题。

1 个答案:

答案 0 :(得分:1)

import仅用于Java类,因此您无法通过MyProtocol导入:import

以下代码适用于您的记录类型和协议。

(ns y
  (:require [.. Myprotocol])
  (:import (x MyData)))