Как убедиться, что переменная clojure имеет правильный тип Java - PullRequest
3 голосов
/ 02 декабря 2011

java-код XSSFRow row = sheet.getRow(p);
код clojure (def row (.getRow sheet p))
Как мы можем убедиться, что строка имеет тип XSSFRow?

Ответы [ 2 ]

7 голосов
/ 02 декабря 2011

Clojure динамически типизируется, поэтому тип переменной / значения определяется во время выполнения.

Если вы хотите убедиться, что значение принадлежит определенному классу, вы можете сделать следующее утверждение:

(assert (= (class row) XSSFRow))

Или, более кратко (благодаря opqdonut):

(assert (instance? XSSFRow row))

Это не проверка для точного класса, но для любого суперкласса:

(instance? Object row) ;=> true
3 голосов
/ 02 декабря 2011

Обратите внимание, что существует способ указания подсказок типа для компилятора с использованием метаданных.В некоторых формах вы можете вставить следующие конструкции:

(let [^String str-val (do-something)] ...)
(def ^double y)
(defn f [^int int-arg ^"[[I" 2d-int-array] ...)

обратите внимание на выражение ^type.Это сокращение для указания одного элемента метаданных, то есть :tag ключ в карте метаданных.Теперь компилятор может оптимизировать код, напрямую разрешая вызовы методов java вместо отражения, теперь, когда он знает точный тип var.

На clojure.org есть пример: http://clojure.org/java_interop#Java%20Interop-Type%20Hints.Он предлагает, и я думаю, что это правильно - не злоупотреблять подсказками типов, поскольку они просто загромождают код и, как правило, не нужны для адекватной производительности.

...