Ваш вопрос ужасно неполный, но я все равно попробую.
Документация для longs
гласит:
Использование: (longs xs)
Это означает, что он ожидает один аргумент (в данном примере с именем xs
). Вы передаете это три аргумента.
Документация для longs
продолжается так:
Приводит к long[]
Приведение означает: он не меняет xs, он просто проверяет, является ли он массивом примитива long
, а затем делает эту информацию доступной для компилятора. По сути, перенос выражения, которое создает long[]
в (longs ...)
, является подсказкой типа для Clojure, так что ему не нужно использовать отражение во время выполнения для разрешения вызова метода с использованием этого значения в качестве аргумента:
// Suppose we have a java class
class JavaClass {
static long[] getSomeLongs() { ... }
static long sum(long[] numbers) { ... }
static float sum(float[] numbers) { ... }
}
;; And this Clojure code:
(defn numbers [] (JavaClass/getSomeLongs))
(JavaClass/sum (numbers))
Clojure динамически типизируется, поэтому, когда он компилирует вторую строку, он не будет знать, что (numbers) возвращает массив long. Ему придется подождать до времени выполнения, а затем найти правильный метод JavaClass / sum, используя отражение. Это дорого
Решение состоит в том, чтобы дать компилятору Clojure подсказку о типе (числа). Таким образом, он может выбрать правильный метод для вызова во время компиляции, что приведет к более быстрой работе программы:
(JavaClass/sum (longs (numbers)))
Но, судя по вашему печально неполному вопросу, это, вероятно, не то, что вы ожидали, когда достигли longs
. Кажется, вы надеялись, что создаст массив длинных из аргументов, которые вы ему дали. Если это то, что вы хотите, используйте это:
(into-array Long/TYPE [1 2 3])
Но вы, вероятно, будете разочарованы результатами его печати:
user=> (println (into-array Long/TYPE [1 2 3]))
#<long[] [J@2321b59a>
Это то, что Java возвращает, когда вы просите его преобразовать массив в строку, так что это то, что печатает Clojure. Если вы хотите увидеть содержимое массива, напечатанного обратно, вам нужно сделать последовательность:
user=> (println (seq (into-array Long/TYPE [1 2 3])))
(1 2 3)