2012-07-28 10 views
33

Estoy envolviendo una java lib en clojure, pero tengo problemas con los argumentos de longitud variable. Diga,¿Cómo manejar los argumentos de longitud variable de Java en clojure?

TestClass.aStaticFunction(Integer... intList){/*....*/} 

¿Cómo podría llamar a esta función en clojure?

+0

posible duplicado de [Implementar un método de interfaz Java con un número variable de args en Clojure] (http://stackoverflow.com/questions/9103777/implement-a-java-interface-method-with-a -variable-number-of-args-in-clojure) – Jeremy

Respuesta

39

Dado que los varargs de Java son actually arrays, puede llamar a las funciones vararg en Clojure pasando una matriz.

Se puede convertir un ss Clojure (tal vez mediante el uso de la variedad de Clojure de las funciones de argumentos variables) en una matriz:

(TestClass/aStaticFunction (into-array Integer [(int 1),(int 2)])) 

o

(defn a-static-function-wrapper [& args] 
    (TestClass/aStaticFunction (into-array Integer args)) 

o hacer una matriz y establecer sus índices manualmente

(TestClass/aStaticFunction (doto (make-array Integer 3) 
           (aset 0 first-element) 
           (aset 1 second-element) 
           (aset 2 third-element))) 
+1

'Integer/TYPE' creará una matriz primitiva, que probablemente no sea lo que se busca aquí ... sospeche que solo quiere' Entero '. – mikera

+0

@mikera ¡también necesito una matriz primitiva! muchas gracias! – qiuxiafei

5

Los argumentos de longitud variable de Java en realidad quieren una matriz como entrada.

Así que en Clojure la llamada debe ser algo como:

(TestClass/aStaticFunction (into-array Integer some-sequence-of-integers)) 
4
(TestClass/aStaticFunction (to-array '(1 2 3 4 5))) 

Por ejemplo,

(java.util.Arrays/asList (to-array '(1 2 3 4 5))) 
Cuestiones relacionadas