The following is throws compile error:
int[] arrs = {1,2,4,3,5,6};
List<Integer> arry = Arrays.asList(arrs);
but this works:
for (Integer i : arrs){
//do something
}
Auto-boxing works in many contexts, I just gave one example of for-loop above. but it fails in the List-view that I make in Arrays.asList().
Why does this fail and why is such as a design implementation chosen?
To make things work you need to use Integer[] instead of int[].
Argument of asList is of type T... and generic types T can't represent primitive types int, so it will represent most specific Object class, which in this case is array type int[].
That is why Arrays.asList(arrs); will try to return List<int[]> instead of List<int> or even List<Integer>.
Some people expect automatic conversion from int[] to Integer[], but lets nor forget that autoboxing works only for primitive types, but arrays are not primitive types.
The Arrays.asList takes generic T[] as argument. This T is always an object, not a primitive. When you give an int[] as parameter (not an array of objects but primitives) it'll think the argument is actually the first element of the vararg. So the resulting list will have the fingerprint List<int[]> instead.
If you want to learn more about generics in Arrays, please read this page: http://docs.oracle.com/javase/tutorial/extra/generics/fineprint.html (part: Arrays)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With