【问题标题】:How do you refer to primitive Java types in Clojure?您如何在 Clojure 中引用原始 Java 类型?
【发布时间】:2010-11-27 23:00:45
【问题描述】:

我想使用反射从 Clojure 获取 Java 对象的方法。其中一种参数类型是 Java 原语,我不知道如何从 Clojure 中引用它们。

例如,假设我想获得String.valueOf(boolean)。我最接近的猜测是做

(.getDeclaredMethod String "valueOf" (into-array [Boolean]))

但这失败了,因为Boolean 本身不是原始类型,而是盒装版本。我试过boolean,但那是指一个内置的Clojure函数,而bool是未定义的。

如何在 Clojure 中引用原始 Java 类型?

【问题讨论】:

    标签: java clojure java-interop


    【解决方案1】:

    您可以通过其盒装等效项的TYPE 属性引用原始类型。例如:

    user=> (.getDeclaredMethod String "valueOf" (into-array [Boolean/TYPE]))
    #<Method public static java.lang.String java.lang.String.valueOf(boolean)>
    

    【讨论】:

      【解决方案2】:

      在相关的说明中,如果你想为一组原语查找 Java Class 对象,你可以使用这个技巧from the tupelo.types namespace

      ; An instance of the java.lang.Class<XXXX[]> (e.g. java.lang.Class<Byte[]>). 
      (def ^:private  class-boolean-array (.getClass (boolean-array   0)))
      (def ^:private  class-byte-array    (.getClass (byte-array      0)))
      (def ^:private  class-char-array    (.getClass (char-array      0)))
      (def ^:private  class-double-array  (.getClass (double-array    0)))
      (def ^:private  class-float-array   (.getClass (float-array     0)))
      (def ^:private  class-int-array     (.getClass (int-array       0)))
      (def ^:private  class-long-array    (.getClass (long-array      0)))
      (def ^:private  class-object-array  (.getClass (object-array    0)))
      (def ^:private  class-short-array   (.getClass (short-array     0)))
      

      这用于类型测试,例如:

      (defn boolean-array?
        "Returns true is the arg is a boolean array, else false."
        [arg]
        (= class-boolean-array (.getClass arg)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多