【问题标题】:How can I cast a Java class in Clojure?如何在 Clojure 中转换 Java 类?
【发布时间】:2010-09-06 15:42:22
【问题描述】:

我想将一个 clojure Java 对象(用 let* 分配)转换为另一个 Java 类类型。这可能吗?如果可以,我该怎么做?

更新: 自从我发布这个问题以来,我意识到我不需要在 Clojure 中进行转换,因为它没有接口的概念,更像是 Ruby 鸭子类型。如果我需要知道一个对象肯定是某种类型,我只需要强制转换,在这种情况下我会得到一个 ClassCastException

【问题讨论】:

  • 你能发布一些示例代码来看看你想要实现什么吗?
  • 自从我发布这个我意识到我不需要强制转换,除非我真的需要知道一个对象的类型

标签: java casting clojure


【解决方案1】:

clojure.core 中有一个cast 函数可以做到这一点:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 其实你说得对,我很快就意识到,由于没有不需要强制转换的接口概念
    猜你喜欢
    • 2019-07-29
    • 1970-01-01
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多