2013-02-22 36 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