我試圖延長一個簡單的Java類toxi.color.ColorList
這個協議:如何擴展具有與clojure.core函數名稱相同的方法的協議的java類?
(defprotocol countable
(count [this]))
(extend-protocol countable
ColorList
(count [this]
(.size this)))
當我評價這個代碼,我看到這些警告
Warning: protocol #'dat00.protocols/countable is overwriting function count
WARNING: count already refers to: #'clojure.core/count in namespace: dat00.protocols, being replaced by: #'dat00.protocols/count
但是這工作得很好:
(count (ColorList.))
=> 0
但是,如果我在相同的文件(或名稱空間)中嘗試此操作,請使用
(count (range 5))
=> IllegalArgumentException No implementation of method: :count of protocol: #'dat00.protocols/countable found for class: clojure.lang.LazySeq clojure.core/-cache-protocol-fn (core_deftype.clj:541)
所以我的問題是:
我誤解了有關協議的一些細節?
謝謝!
協議方法導致在當前名稱空間中定義具有相同名稱的函數。當你從一些Clojure代碼中調用一個協議方法時,你實際調用的是一個生成的函數,它查找併發送到適當的實現。 – Alex
在此先感謝亞歷克斯,但你會如何解決這種情況「當前名稱空間衝突」? – tangrammer
與其他命名空間衝突一樣,如下面的答案中所述。它碰巧是導致衝突的協議方法的事實並不重要。 – Alex