为什么我可以初始化ArrayList,如下所示:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
但使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
答案 0 :(得分:15)
如果需要,Java会自动将int
转换为long
。
但是,如果需要从Integer
到Long
的转换,则Java 不会执行相同的操作。
函数Arrays.asList(...)
返回List<E>
,其中E
是用作参数的类型。使用1, 2, 3
时,类型为int
。但是,Java中不可能将数据类型的一般用法用作List<int>
(至少目前)。因此,它会自动将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
的第一种常见类型是抽象类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
答案 1 :(得分:11)
这是因为1
和2
是整数,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)
您必须使用文字Long
或l
指定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));