初始化ArrayList <long>

时间:2017-10-04 12:29:12

标签: java arrays list arraylist long-integer

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

ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));

但使用时出现错误:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));

4 个答案:

答案 0 :(得分:15)

说明

如果需要,Java会自动将int转换为long

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

函数Arrays.asList(...)返回List<E>,其中E是用作参数的类型。使用1, 2, 3时,类型为int。但是,Java中不可能将数据类型的一般用法用作List<int>(至少目前)。因此,它会自动将int转换为Integer并生成List<Integer>个对象。此过程称为自动装箱,Java可以对所有数据类型执行此操作,以执行相应的对象表示。

如果您现在使用构造函数new ArrayList<Integer>(List<E> list),则期望EInteger类型。因此List<Integer>可用作输入。

但是当您使用new ArrayList<Long>(List<E> list)时,E显然需要Long类型。但是,对象Integer 不属于 Long,因此不接受参数。 IntegerLong的第一种常见类型是抽象类Number(也包含DoubleFloat和其他类型)documentation

解决方案

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

new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));

现在您收到List<Long>,然后将其添加到ArrayList<Long>

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

答案 1 :(得分:11)

这是因为12是整数,Arrays.asList(1, 2)会创建List<Integer>

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

您有多种选择,但最简单的方法是通过添加int后缀将long更改为L

List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));

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

List<Long> x = List.of(1L, 2L);

答案 2 :(得分:7)

您必须使用文字Longl指定L个号码。

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));

答案 3 :(得分:4)

因为Arrays.asList(1,2)会隐式返回List<Integer>

您可以使用以下习语解决此问题:

ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));