2012-05-03 6 views
6

ho una libreria di Clojure che definisce un protocollo MQHandle, e la estende"Nessun singolo metodo di [...] trovato per la funzione" cerca di utilizzare un protocollo

(ns example.mq 
    (:import [java.util.concurrent BlockingQueue])) 

(defprotocol MQHandle 
    (send-message [this key body & params]) 

(extend-type BlockingQueue 
    MQHandle 
    (send-message [this key body & params] 
    (.put this (merge {::key key, ::body body} 
         (into {} (partition 2 params))))) 

(defn get-handle ^BlockingQueue [& config] 
    "return a BlockingQueue tied to a thread which consumes messages 
    and submits them to a remote message queue" 
    ...) 

... ma quando provo a usalo:

(require '[example.mq :as mq]) 

(def handle (mq/get-handle config)) 

(satisfies? mq/MQHandle handle) 
; => true 

(mq/send-message handle "key" "body") 
; java.lang.IllegalArgumentException: No single method: send_message of interface: 
; com.indeed.clojure_network_repl.mq.MQHandle found for function: send-message of 
; protocol: MQHandle 

Non bevo il significato di questa eccezione, o cosa dovrei fare in modo diverso.

risposta

12

Le funzioni di protocollo non supportano gli argomenti di riposo.

Problemi correlati