2010-06-10 72 views
10

我試圖解決Clojure中的反射警告,這似乎是由於缺少對普通Java對象的函數返回值的類型推斷而導致的。在Clojure中鍵入函數的提示

簡單的示例代碼演示了這個問題:

(set! *warn-on-reflection* true)  

(defn foo [#^Integer x] (+ 3 x)) 

(.equals (foo 2) (foo 2)) 

=> Reflection warning, NO_SOURCE_PATH:10 - call to equals can't be resolved. 
    true 

什麼是解決它的最好方法?這可以通過類型提示來完成嗎?

+0

你使用的是什麼版本的Clojure?我在我的Clojure v1.0中試過你的例子,它似乎很好地工作... – Greg 2010-06-10 21:30:48

+0

這是一個clojure 1.2構建。請注意,警告只顯示(set!* warn-on-reflection * true),這可能是區別....編輯問題以使其更清晰 – mikera 2010-06-10 21:40:18

+0

是的,就是這樣。我現在看到它。 – Greg 2010-06-10 21:42:30

回答

11

這兩個版本似乎工作:

user> (defn foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
Reflection warning, NO_SOURCE_FILE:1 - call to equals can't be resolved. ;' 
true 
user> (.equals ^Integer (foo 2) ^Integer (foo 2)) 
true 
user> (defn ^Integer foo [^Integer x] (+ 3 x)) 
#'user/foo 
user> (.equals (foo 2) (foo 2)) 
true 

注意類型提示還是有點通量Clojure中,現在領導到1.2版本,所以這可能無法正常工作永遠以同樣的方式。還請注意,#^已被棄用,轉而使用^

+0

太棒了,非常感謝!還有很好的瞭解變化的語法......生活在最前沿的樂趣我猜:-) – mikera 2010-06-10 22:30:01

+0

太棒了!期待加快我的代碼使用這:) – jorgeu 2012-10-12 13:45:42