初始化 ArrayList<Long>

Initialize ArrayList<Long>

为什么我可以像这样初始化ArrayList:

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

但是在使用时出现错误:

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

因为Arrays.asList(1,2)会隐式return一个List<Integer>

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

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

那是因为 12 是整数,而 Arrays.asList(1, 2) 创建一个 List<Integer>

并且ArrayList的复制构造函数要求参数是相同的泛型。

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

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

注意 Java 9 你也可以这样写:

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

您必须使用文字 lL 指定 Long 数字。

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

否则 12 被理解为整数,结果是 List<Integer>.

说明

如果需要,

Java 会自动将 int 转换为 long

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

函数 Arrays.asList(...) returns a List<E> 其中 E 是用作参数的类型。当您使用 1, 2, 3 时,类型是 int。然而,data-types 的一般用法在 Java 中是不可能的(至少目前是这样)。因此它会自动将 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 的第一个常见类型是抽象 class 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