初始化 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));
那是因为 1
和 2
是整数,而 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);
您必须使用文字 l
或 L
指定 Long
数字。
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
否则 1
和 2
被理解为整数,结果是 List<Integer>
.
说明
如果需要,Java 会自动将 int
转换为 long
。
但是,如果需要从 Integer
到 Long
的转换,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)
,它期望 E
是 Integer
类型的东西。所以 List<Integer>
作为输入。
但是当你使用 new ArrayList<Long>(List<E> list)
时,显然 E
需要是 Long
类型。但是对象 Integer
不是类型 Long
因此它 不接受 参数。 Integer
和 Long
的第一个常见类型是抽象 class Number
(它还包含 Double
、Float
等)(documentation).
解决方案
所以这一切都围绕着输入 1, 2, 3
被解释为 int
而不是 long
。您可以通过 明确地 告诉 Java 来 将 数字解释为 long
来解决此问题,您可以通过附加 l
或 L
后的数字:
new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
现在您收到 List<Long>
,然后将其添加到 ArrayList<Long>
。
请注意,可以使用相同的技术将十进制数显式解释为 float
而不是 double
:1.5F
或 1.5f
为什么我可以像这样初始化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));
那是因为 1
和 2
是整数,而 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);
您必须使用文字 l
或 L
指定 Long
数字。
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
否则 1
和 2
被理解为整数,结果是 List<Integer>
.
说明
如果需要,Java 会自动将 int
转换为 long
。
但是,如果需要从 Integer
到 Long
的转换,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)
,它期望 E
是 Integer
类型的东西。所以 List<Integer>
作为输入。
但是当你使用 new ArrayList<Long>(List<E> list)
时,显然 E
需要是 Long
类型。但是对象 Integer
不是类型 Long
因此它 不接受 参数。 Integer
和 Long
的第一个常见类型是抽象 class Number
(它还包含 Double
、Float
等)(documentation).
解决方案
所以这一切都围绕着输入 1, 2, 3
被解释为 int
而不是 long
。您可以通过 明确地 告诉 Java 来 将 数字解释为 long
来解决此问题,您可以通过附加 l
或 L
后的数字:
new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
现在您收到 List<Long>
,然后将其添加到 ArrayList<Long>
。
请注意,可以使用相同的技术将十进制数显式解释为 float
而不是 double
:1.5F
或 1.5f