初始化数组列表<长>

2022-09-03 16:30:34

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

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

但是使用时出现错误:

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

答案 1

解释

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

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

该函数返回 a,其类型用作参数。当您使用时,类型是 。但是,数据类型的通用用法在Java中是不可能的(至少目前是这样)。因此,它会自动转换为并生成对象。这个过程称为自动装箱,Java可以对所有数据类型进行相应的对象表示。Arrays.asList(...)List<E>E1, 2, 3intList<int>intIntegerList<Integer>

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

但是当你使用时显然需要的类型。但是,该对象不是类型,因此它不接受该参数。的第一种常见类型是抽象类(也包含 ,和其他类)(文档)。new ArrayList<Long>(List<E> list)ELongIntegerLongIntegerLongNumberDoubleFloat


溶液

因此,这一切都围绕着被解释为而不是的输入。您可以通过显式告诉 Java 将数字解释为 来解决此问题,您可以通过在数字之后附加或后附加来执行此操作:1, 2, 3intlonglonglL

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

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


请注意,可以使用相同的技术将十进制数显式解释为:或floatdouble1.5F1.5f


答案 2

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

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

您有几个选项,但最简单的一个是通过添加后缀将 s 更改为 s:intlongL

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

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

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