Apoya a todas las demás respuestas. Aquí es como una sola línea:
(def byte-array? (partial instance? (Class/forName "[B")))
Para otras primitivas, se refiere a http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#getName%28%29 (o la especificación de Java). O simplemente haz lo que sugiere Gerrit con (type (xyz-array 0))
. En concreto se puede utilizar:
"[Z" boolean array
"[B" byte array
"[C" char array
"[D" double array
"[F" float array
"[I" integer array
"[J" long array
"[S" short array
Puesto que el rendimiento fue mencionado, aquí está un pequeño resultado del benchmark de correr (time (dotimes [_ 500000] (byte-array? x)))
, y con byte-array-class
def'd
(def byte-array? (partial instance? (Class/forName "[B")))
78.518335 msecs
(defn byte-array? [obj] (instance? byte-array-class obj))
34.879537 msecs
(defn byte-array? [obj] (= (type obj) byte-array-class))
49.68781 msecs
instance?
vs = type
ejemplo? gana
partial
vs defn
= defn gana
pero ninguno de estos enfoques es probable que no habrá un cuello de botella en el rendimiento.
No estoy seguro de cuál sería el código de Clojure, pero podría crear una matriz vacía para cada tipo primitivo, llamar a getClass() y codificar los resultados. El objeto Class debería ser el mismo para cada matriz de ese tipo primitivo: compararía los cacheados con 'object.getClass()'.(getClass() no debería ser realmente una llamada lenta) – millimoose