初始化数组列表<长>
为什么我可以初始化ArrayList,如下所示:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
但是使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
为什么我可以初始化ArrayList,如下所示:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
但是使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
如果需要,Java 会自动转换为。int
long
但是,如果需要从 到 的转换,Java 不会执行相同的操作。Integer
Long
该函数返回 a,其类型用作参数。当您使用时,类型是 。但是,数据类型的通用用法在Java中是不可能的(至少目前是这样)。因此,它会自动转换为并生成对象。这个过程称为自动装箱,Java可以对所有数据类型进行相应的对象表示。Arrays.asList(...)
List<E>
E
1, 2, 3
int
List<int>
int
Integer
List<Integer>
如果您现在使用构造函数,则它应为 类型 。因此,a 可用作输入。new ArrayList<Integer>(List<E> list)
E
Integer
List<Integer>
但是当你使用时显然需要的类型。但是,该对象不是类型,因此它不接受该参数。的第一种常见类型是抽象类(也包含 ,和其他类)(文档)。new ArrayList<Long>(List<E> list)
E
Long
Integer
Long
Integer
Long
Number
Double
Float
因此,这一切都围绕着被解释为而不是的输入。您可以通过显式告诉 Java 将数字解释为 来解决此问题,您可以通过在数字之后附加或后附加来执行此操作:1, 2, 3
int
long
long
l
L
new ArrayList<Long>(Arrays.asList(1L, 2L, 3L));
现在,您将收到一个,然后将其添加到.List<Long>
ArrayList<Long>
请注意,可以使用相同的技术将十进制数显式解释为:或float
double
1.5F
1.5f
这是因为 和 是整数,并创建了一个 .1
2
Arrays.asList(1, 2)
List<Integer>
并且 的复制构造函数要求参数具有相同的泛型类型。ArrayList
您有几个选项,但最简单的一个是通过添加后缀将 s 更改为 s:int
long
L
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
请注意,使用Java 9,您还可以编写:
List<Long> x = List.of(1L, 2L);