【发布时间】:2012-07-26 23:32:26
【问题描述】:
我正在将一个 java 库包装到 clojure 中,但是我在处理可变长度参数时遇到了问题。说,
TestClass.aStaticFunction(Integer... intList){/*....*/}
如何在 clojure 中调用这个函数?
【问题讨论】:
标签: clojure variadic-functions clojure-java-interop
我正在将一个 java 库包装到 clojure 中,但是我在处理可变长度参数时遇到了问题。说,
TestClass.aStaticFunction(Integer... intList){/*....*/}
如何在 clojure 中调用这个函数?
【问题讨论】:
标签: clojure variadic-functions clojure-java-interop
由于 Java 可变参数是 actually arrays,因此您可以通过传递数组来调用 Clojure 中的可变参数函数。
您可以将 Clojure 序列(可能通过使用 Clojure 的各种可变参数函数)转换为数组:
(TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)]))
或
(defn a-static-function-wrapper [& args]
(TestClass/aStaticFunction (into-array Integer args))
或者创建一个数组并手动设置它的索引
(TestClass/aStaticFunction (doto (make-array Integer 3)
(aset 0 first-element)
(aset 1 second-element)
(aset 2 third-element)))
【讨论】:
Java 可变长度参数实际上需要一个数组作为输入。
所以在 Clojure 中调用应该是这样的:
(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers))
【讨论】:
(TestClass/aStaticFunction (to-array '(1 2 3 4 5)))
例如
(java.util.Arrays/asList (to-array '(1 2 3 4 5)))
【讨论】: