代码之家  ›  专栏  ›  技术社区  ›  yazz.com

如何在Clojure中强制转换Java类?

  •  14
  • yazz.com  · 技术社区  · 14 年前

    我想将clojurejava对象(用let*赋值)强制转换为另一个Java类类型。这有可能吗?如果有,我怎么做?

    更新:

    2 回复  |  直到 14 年前
        1
  •  16
  •   Michał Marczyk    14 年前

    有一个 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 (这是应该在用户代码中使用的内容)。

        2
  •  10
  •   Alex Taggart    14 年前

    请注意 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>