2012-08-28 83 views
3

我試圖定義的Clojure 1.4與原始參數的協議(讓我能避免性能敏感的代碼不必要的原始拳):使用與原始參數的協議

(defprotocol A 
    (foo [a ^long x])) 

(extend-type java.lang.String A 
    (foo [s ^long x] (.charAt s x))) 

這個樣子吧工作正常,但我嘗試使用它時出現異常:

(foo "abracadarbra" 3) 
=> ClassCastException XXXX cannot be cast to clojure.lang.IFn$OLO 

我在做什麼錯?

回答

2

採取型暗示出defprotocol,並把它留在extend-type

(defprotocol A 
(foo [a x])) 

(extend-type java.lang.String A 
    (foo [s ^Long x] (.charAt s x))) 
nil 
core> (foo "abracadarbra" 3) 
\a 

,或者你可以改變類型提示,像這樣:

(defprotocol A 
(foo [a ^Long/TYPE x])) 

(extend-type java.lang.String A 
    (foo [s ^long x] (.charAt s x))) 
nil 
core> (foo "abracadarbra" 3) 
\a 

這仍然不會產生反射警告,而不提示defprotocol

編輯:

(extend-type java.lang.String A 
    (foo [s ^Long x] (type x))) 
nil 
core> (foo "abracadarbra" 3) 
java.lang.Long 
+0

感謝亞瑟!這有效 - 但它實際上是使用函數的原始版本嗎? – mikera

+0

它似乎不是......: -/ –

+0

嗯,不完全解決這個問題,然後我的意圖是找到一種方法來避免拳擊原始參數..... – mikera