Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to handle java variable length arguments in clojure?

I'am wrapping a java lib into clojure, but i have problems dealing with variable length arguments. Say,

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

How could i call this function in clojure?

like image 365
qiuxiafei Avatar asked Jul 28 '12 15:07

qiuxiafei


People also ask

How to handle variable arguments in Java?

Before JDK 5, variable length arguments could be handled in two ways: One was using overloading, other was using array argument. There can be only one variable argument in a method. Variable argument (Varargs) must be the last argument.

Why Varargs in Java?

Varargs can be used when we are unsure about the number of arguments to be passed in a method. It creates an array of parameters of unspecified length in the background and such a parameter can be treated as an array in runtime.

What is Varargs method in Java?

Varargs is a short name for variable arguments. In Java, an argument of a method can accept arbitrary number of values. This argument that can accept variable number of values is called varargs. The syntax for implementing varargs is as follows: accessModifier methodName(datatype… arg) { // method body }


1 Answers

Since Java varargs are actually arrays, you can call vararg functions in Clojure by passing an array.

You could convert a Clojure seq (maybe by using Clojure's variety of variable argument functions) into an array:

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

or

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

Or make an array and set its indices manually

(TestClass/aStaticFunction (doto (make-array Integer 3)                               (aset 0 first-element)                               (aset 1 second-element)                               (aset 2 third-element))) 
like image 194
Zach L Avatar answered Sep 24 '22 02:09

Zach L