a simple question about Arrays.asList

389 views
Skip to first unread message

webber

unread,
May 21, 2015, 5:08:46 PM5/21/15
to clo...@googlegroups.com
I am trying to use java.util.Arrays/asList in Clojure.

(java.util.Arrays/asList 1 2 3)

CompilerException java.lang.IllegalArgumentException: No matching method: asList, compiling:(NO_SOURCE_PATH:1:1) 

(java.util.Arrays/asList 1)

ClassCastException java.lang.Long cannot be cast to [Ljava.lang.Object;  user/eval7195 (NO_SOURCE_FILE:1)

What should I do to work it ?

Aaron Cohen

unread,
May 21, 2015, 5:43:26 PM5/21/15
to clo...@googlegroups.com
Since Arrays.asList is a variadic method, the Java compiler is magically creating an array behind the scenes for you when you write Java code invoking it.

Clojure does variadic functions differently for native clojure code.

To do interop with a Java variadic method have to create the array yourself:
(java.util.Arrays/asList (make-array Object 1 2 3))

Why are you trying to use Arrays#asList btw? There are probably better ways to do what you're trying to do.

--Aaron

--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clo...@googlegroups.com
Note that posts from new members are moderated - please be patient with your first post.
To unsubscribe from this group, send email to
clojure+u...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
---
You received this message because you are subscribed to the Google Groups "Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Mauricio Aldazosa

unread,
May 21, 2015, 6:11:25 PM5/21/15
to clo...@googlegroups.com
There are many things that need to be understood in a call like this.

First of all, that method receives an array as its argument:  https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList(T...)

From your first example I think you are trying to translate to clojure the following java call:

java.util.Arrays.asList(1, 2, 3);

In java this is a varargs call, which means java will change the call to one using an array as the parameter (http://docs.oracle.com/javase/8/docs/technotes/guides/language/varargs.html).

So, in order to make that call we need to wrap those arguments in an array. The easiest way to do this would be to wrap the arguments in a vector an turn that into an array:

user> (java.util.Arrays/asList (into-array [1 2 3]))
[1 2 3]

If you don't already have a sequence (the vector in the previous example) then you can use a function to do the work:

user> (defn as-list [& args] (java.util.Arrays/asList (into-array args)))
#'user/as-list
user> (as-list 1 2 3)
[1 2 3]
user> (type (as-list 1 2 3))
java.util.Arrays$ArrayList


Cheers,
Mauricio

webber

unread,
May 22, 2015, 8:54:14 AM5/22/15
to clo...@googlegroups.com
Hi Aaron,

Thank you for your reply. I was able to understand.

> Why are you trying to use Arrays#asList btw? There are probably better ways to do what you're trying to do.

I just wanted to test reify to implement java.util.Comarator as follows:

(java.util.Collections/sort  x 
 (reify java.util.Comparator
     (compare [this x y]
       (Integer/compare x y))))

Initially, I gave a test data like this.

 (def x 
  (doto (java.util.ArrayList.)
    (.add 3)(.add 1)(.add 2)))

 However, I thought asList is better. Are there better ways to do ?

Thanks,
MH

webber

unread,
May 22, 2015, 9:25:54 AM5/22/15
to clo...@googlegroups.com
Hi Mauricio,

The into-array worked fine !

Thanks,
MH

Rafal Lewczuk

unread,
May 22, 2015, 10:44:28 AM5/22/15
to clo...@googlegroups.com
Hi,

Try this:

(java.util.Arrays/asList (to-array [1 2 3 4]))


Regards,
rle
Reply all
Reply to author
Forward
0 new messages