Why I can initialize ArrayList, like this:
ArrayList x = new ArrayList(Arrays.asList(1,2));
But got Error whe
You have to specify a Long
number using literal l
or L
.
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
That's because 1
and 2
are ints and Arrays.asList(1, 2)
creates a List<Integer>
.
And the copy constructor of ArrayList
requires the argument to be of the same generic type.
You have several options but the simplest one is to change the int
s into long
s by adding a L
suffix:
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Note that with Java 9 you can also write:
List<Long> x = List.of(1L, 2L);
Because Arrays.asList(1,2)
will implicitly return a List<Integer>
.
You can fix this by using the following idiom:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));
Java automatically transforms int
to long
if needed.
However, Java does not do the same if a transformation from Integer
to Long
is needed.
The function Arrays.asList(...)
returns a List<E>
with E
being the type used as parameters. As you use 1, 2, 3
the type is int
. However the generic usage of data-types as List<int>
is not possible in Java (at least currently). Therefore it automatically transforms int
to Integer
and produces a List<Integer>
object. This process is called auto-boxing, Java can do this for all data-types to their corresponding object representation.
If you now use the constructor new ArrayList<Integer>(List<E> list)
it expects E
to be something of type Integer
. So a List<Integer>
works as input.
But when you use new ArrayList<Long>(List<E> list)
obviously E
needs to be of type Long
. However the object Integer
is not of type Long
thus it does not accept the parameter. The first common type of Integer
and Long
is the abstract class Number
(which also holds Double
, Float
and others) (documentation).
So it all revolves around the input 1, 2, 3
being interpreted as int
instead of long
. You can fix this by explicitly telling Java to interpret the numbers as long
, you do so by appending l
or L
after the number:
new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
Now you receive a List<Long>
which then is added to an ArrayList<Long>
.
Note that the same technique can be used to explicitly interpret decimal numbers as float
instead of double
: 1.5F
or 1.5f