如何在Clojure中投射Java类?
我想将一个 clojure Java 对象(与 let* 一起分配)强制转换为另一个 Java 类类型。这是否可能,如果是这样,那么我该怎么做?
更新:自从我发布这个问题以来,我意识到我不需要在Clojure中转换,因为它没有界面的概念,更像是Ruby鸭打字。只有当我需要知道一个对象肯定是某种类型的时,我才需要强制转换,在这种情况下,我得到一个ClassCastException。
我想将一个 clojure Java 对象(与 let* 一起分配)强制转换为另一个 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
请注意,该函数实际上只是一种特定类型的断言。没有必要在 clojure 中实际铸造。如果您试图避免反射,则只需键入提示:cast
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>