如何在Clojure中转换Java类?

Zub*_*air 15 java casting clojure

我想将一个clojure Java对象(用let*赋值)转换为另一个Java类类型.这是可能的,如果可以的话,我该怎么做?

更新:自从我发布这个问题后,我意识到我不需要使用Clojure,因为它没有接口的概念,而且更像是Ruby duck typing.如果我需要知道某个对象肯定属于某种类型,我只需要强制转换,在这种情况下我得到一个ClassCastException

Mic*_*zyk 16

有一个cast功能可以做到clojure.core:

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

顺便说一句,你不应该let*直接使用- 它只是一个实现细节let(这是应该在用户代码中使用的).


Ale*_*art 10

请注意,该cast函数实际上只是一种特定类型的断言.在clojure中不需要实际的铸造.如果你试图避免反射,那么只需输入提示:

user=> (set! *warn-on-reflection* true)
true
user=> (.toCharArray "foo")  ; no reflection needed
#<char[] [C@a21d23b>
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[] [C@34e93999>
user=> (defn bar [^String x] ; avoid the reflection with type-hint
         (.toCharArray x)) 
#'user/bar
user=> (bar "foo")
#<char[] [C@3b35b1f3>
Run Code Online (Sandbox Code Playgroud)