Как вы относитесь к примитивным типам Java в Clojure? - PullRequest
5 голосов
/ 28 ноября 2010

Я хотел бы использовать отражение, чтобы получить метод объекта Java от Clojure.Одним из типов аргументов является примитив Java, и я не знаю, как ссылаться на них из Clojure.

Например, скажем, я хотел получить String.valueOf(boolean).Мое ближайшее предположение должно было бы сделать

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

, но это терпит неудачу, потому что Boolean не сам тип примитива, а коробочная версия.Я пробовал boolean, но это относится к встроенной функции Clojure, а bool не определено.

Как мне ссылаться на примитивный тип Java в Clojure?

Ответы [ 2 ]

10 голосов
/ 28 ноября 2010

Вы можете ссылаться на типы примитивов через свойство TYPE их коробочного эквивалента.Например:

user=> (.getDeclaredMethod String "valueOf" (into-array [Boolean/TYPE]))
#<Method public static java.lang.String java.lang.String.valueOf(boolean)>
0 голосов
/ 25 марта 2019

В связанной заметке, если вы хотите найти объект класса Java для массива примитивов, вы можете использовать этот трюк из пространства имен tupelo.types :

; 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)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...