我想將一個clojure Java對象(賦予let *)轉換爲另一個Java類類型。這是可能的,如果是的話,我該怎麼做?如何在Clojure中投射Java類?
更新: 由於我發佈了這個問題,我意識到我不需要投入Clojure,因爲它沒有接口的概念,更像是Ruby鴨打字。我只需要投如果我需要知道對象絕對是一個特定類型的,在這種情況下,我得到一個ClassCastException
我想將一個clojure Java對象(賦予let *)轉換爲另一個Java類類型。這是可能的,如果是的話,我該怎麼做?如何在Clojure中投射Java類?
更新: 由於我發佈了這個問題,我意識到我不需要投入Clojure,因爲它沒有接口的概念,更像是Ruby鴨打字。我只需要投如果我需要知道對象絕對是一個特定類型的,在這種情況下,我得到一個ClassCastException
有一個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
(這是用戶代碼應該使用的)的實現細節。
請注意,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]>
其實你的權利,我很快意識到,因爲沒有接口的概念,不需要鑄造 – Zubair 2010-09-06 17:48:20
你可以發佈一些示例代碼來看看你想實現什麼嗎? – 2010-09-06 16:04:40
因爲我發佈了這個,我意識到我不需要施放,除非我真的需要知道對象的類型 – Zubair 2010-09-06 17:48:56