2012-07-28 38 views
8

我想我的程序行爲不同的基本類型和它們的包裝類之間,例如:如何在原始類型上分派multimethod?

(defmulti try-type class) 

(defmethod try-type Integer [arg] 
    (println "Integer")) 

(defmethod try-type Integer/TYPE [arg] 
    (println "int")) 

但它不工作,雖然我嘗試整數和int都

user=> (try-type (.intValue (int 2))) 
Integer 
nil 
user=> (try-type (int 2)) 
Integer 
nil 

那麼,有可能在原始類型上分派multimethod?

====== EDIT ======

我被包裹一個谷歌番石榴成Clojure的。它有一個原始庫,如布爾,Dobules,Ints等。他們有一些共同的方法,所以我想嘗試multimethod。

+0

你能解釋你爲什麼要這樣做嗎?目前在基元上調度是不可能的,但是可能有一個很好的方法來實現相同的目標(谷歌「XY問題」) – mikera 2012-07-30 00:46:03

+0

@mikera編輯! – qiuxiafei 2012-07-30 02:01:18

回答

4

不,目前不可能。函數的一個arg(比如multimethod dispatch函數)是一個Object(因此原語將被裝箱)或一個原始的long/double(因此對象將被拆箱)。你的場景需要一個函數,它可以在函數內部保留這個區別。

也就是說,無論您嘗試解決的實際問題是什麼,都可能有解決方案。