2012-07-28 19 views
33

Sto avvolgendo una java lib in clojure, ma ho problemi con argomenti a lunghezza variabile. Dire,Come gestire gli argomenti di lunghezza variabile java in clojure?

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

Come potrei chiamare questa funzione in clojure?

+0

possibile duplicato di [Implementare un metodo di interfaccia Java con un numero variabile di argomenti in Clojure] (http://stackoverflow.com/questions/9103777/implement-a-java-interface-method-with-a -variabile-numero-di-args-in-clojure) – Jeremy

risposta

39

Poiché le vararg Java sono actually arrays, è possibile chiamare le funzioni vararg in Clojure passando una matrice.

Si potrebbe convertire un ss Clojure (forse utilizzando varietà di funzioni di argomenti variabili di Clojure) in un array:

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

o

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

o fare un array e impostare i suoi indici manualmente

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

'Integer/TYPE' creerà una matrice primitiva, che probabilmente non è ciò che si vuole qui .... sospettiamo che tu voglia solo' Integer'. – mikera

+0

@mikera ho anche bisogno di array primitivi! grazie mille !! – qiuxiafei

5

Gli argomenti di lunghezza variabile Java richiedono effettivamente un array come input.

Quindi, in Clojure la chiamata deve essere qualcosa di simile:

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

Per esempio

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