初始化ArrayList <Long>

Luk*_*uke 5 java arrays list arraylist long-integer

为什么我可以初始化ArrayList,如下所示:

ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
Run Code Online (Sandbox Code Playgroud)

但使用时出现错误:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
Run Code Online (Sandbox Code Playgroud)

Zab*_*uza 17

说明

如果需要,Java会自动转换intlong.

但是,如果需要转换为,则Java 不会执行相同的操作.IntegerLong

该函数Arrays.asList(...)返回一个List<E>E被用作参数的类型.当你使用1, 2, 3的类型是int.然而一般使用的数据类型List<int>是不可能在Java中(至少目前).因此,自动将intInteger,并产生一个List<Integer>对象.这个过程称为自动装箱,Java可以对所有数据类型执行此操作,以实现相应的对象表示.

如果你现在使用构造函数,new ArrayList<Integer>(List<E> list)E应该是类型的东西Integer.所以一个List<Integer>作为输入.

但是当你使用时new ArrayList<Long>(List<E> list)显然E需要类型Long.然而,对象Integer类型的不 Long因此它并不能接受的参数.的第一公共类型IntegerLong是抽象类Number(其也适用Double,Float和其它物质)(文档).


所以这一切都围绕着1, 2, 3被解释为的输入int而不是long.你可以通过明确告诉Java 解释数字来解决这个问题long,你可以通过追加lL在数字后面来解释:

new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
Run Code Online (Sandbox Code Playgroud)

现在你收到一个List<Long>然后被添加到ArrayList<Long>.


请注意,可以使用相同的技术明确地将十进制数解释为:float而不是double:1.5F1.5f


ass*_*ias 12

这是因为1并且2是整数并Arrays.asList(1, 2)创造了一个List<Integer>.

并且复制构造函数ArrayList要求参数具有相同的泛型类型.

您有几个选项,但最简单的方法是通过添加后缀将ints 更改为longs L:

List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Run Code Online (Sandbox Code Playgroud)

请注意,使用Java 9,您还可以编写:

List<Long> x = List.of(1L, 2L);
Run Code Online (Sandbox Code Playgroud)


Nik*_*las 7

您必须Long使用文字l或指定一个数字L.

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
Run Code Online (Sandbox Code Playgroud)