I don't understand why the following does not work:
public void doSomething(int... args){
List<Integer> broken = new ArrayList<Integer>(Arrays.asList(args))
}
Its my understanding that the compiler converts the "int... args" to an array, so the above code should work.
Instead of working I get:
cannot find symbol symbol: constructor ArrayList(java.util.List
<int[]
>) location: class java.util.ArrayList<java.lang.Integer
>
Thats bizarre. I'm not adding an array to array list, I'm adding each element from the list to the arraylist. Whats going on?
Java cannot autobox an array, only individual values. I would suggest changing your method signature to
Then the autoboxing will take place when calling
doSomething
, rather than trying (and failing) when callingArrays.asList
.What is happening is Java is now autoboxing each individual value as it is passed to your function. What you were trying to do before was, by passing an
int[]
toArrays.asList()
, you were asking that function to do the autoboxing.But autoboxing is implemented by the compiler -- it sees that you needed an object but were passing a primitive, so it automatically inserted the necessary code to turn it into an appropriate object. The
Arrays.asList()
function has already been compiled and expects objects, and the compiler cannot turn anint[]
into anInteger[]
.By moving the autoboxing to the callers of your function, you've solved that problem.
You can do
or
You can solve this using Guava:
Or with streams:
In this case, autoboxing (automatic conversion from
int
toInteger
) doesn't work. You have to add eachint
manually to the list.If you need code like that often, consider using commons lang which has
org.apache.commons.lang.ArrayUtils.toObject(int[])