2013-02-22 50 views
3

我創建了一個simpe協議和類型Clojure中:Clojure - Object上的默認協議實現失敗?

(defprotocol Saving 
    (save [this] "saves to mongodb")) 

;default implementation 
(extend-type Object 
    Saving 
    (save [this] (encode this))) 


(deftype NewsItem 
    [text date] 
    Saving) 

然而,當我嘗試:

=> (def news-item (->NewsItem "Super News!!!" "today")) 

然後:

=> (save news-item) 

我得到:

AbstractMethodError luminous_test.models.model.NewsItem.save()Ljava/lang/Object; luminous-test.models.model/eval2450 (NO_SOURCE_FILE:1) 

什麼是我做錯了?我覺得像下面創建一個默認的協議實現的線,但是這就是我正在......

回答

4

而不是

(deftype NewsItem 
    [text date] 
    Saving) 

只需使用:

(deftype NewsItem 
    [text date]) 
+1

這樣做的原因是,通過包括'Saving',你告訴Clojure'NewsItem'有它自己的'save'實現,但是它沒有。 – 2013-02-23 03:13:37