2010-09-06 74 views
14

我想將一個clojure Java對象(賦予let *)轉換爲另一個Java類類型。這是可能的,如果是的話,我該怎麼做?如何在Clojure中投射Java類?

更新: 由於我發佈了這個問題,我意識到我不需要投入Clojure,因爲它沒有接口的概念,更像是Ruby鴨打字。我只需要投如果我需要知道對象絕對是一個特定類型的,在這種情況下,我得到一個ClassCastException

+0

你可以發佈一些示例代碼來看看你想實現什麼嗎? – 2010-09-06 16:04:40

+0

因爲我發佈了這個,我意識到我不需要施放,除非我真的需要知道對象的類型 – Zubair 2010-09-06 17:48:56

回答

15

有一個cast功能做,在clojure.core

user> (doc cast) 
------------------------- 
clojure.core/cast 
([c x]) 
    Throws a ClassCastException if x is not a c, else returns x. 

通過方式,你不應該直接使用let* - 它只是let(這是用戶代碼應該使用的)的實現細節。

9

請注意,cast函數實際上只是一種特定類型的斷言。在clojure中不需要實際的鑄造。如果你想避免反射,那麼只需鍵入提示:

user=> (set! *warn-on-reflection* true) 
true 
user=> (.toCharArray "foo") ; no reflection needed 
#<char[] [[email protected]> 
user=> (defn bar [x]   ; reflection used 
     (.toCharArray x)) 
Reflection warning, NO_SOURCE_PATH:17 - reference to field toCharArray can't be resolved. 
#'user/bar 
user=> (bar "foo")   ; but it still works, no casts needed! 
#<char[] [[email protected]> 
user=> (defn bar [^String x] ; avoid the reflection with type-hint 
     (.toCharArray x)) 
#'user/bar 
user=> (bar "foo") 
#<char[] [[email protected]> 
+0

其實你的權利,我很快意識到,因爲沒有接口的概念,不需要鑄造 – Zubair 2010-09-06 17:48:20