为什么我可以像这样初始化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
,它会自动进行转换。
但是,如果需要将类型从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
等)(文档)。
所以问题都围绕着输入的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
asList
返回的是一个自定义的固定大小的 ArrayList
,而不是 java.util.ArrayList
。 - Oleg这是因为1
和2
是整数类型(int),而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);
Arrays.asList
,返回一个不可变的List - 如果您想让x
可变,仍然需要使用复制构造函数。 - Hulk你必须使用字面量 l
或 L
来指定一个 Long
数字。
List<Long> x = new ArrayList<Long>(Arrays.asList(1L, 2L));
否则,1
和 2
被理解为整数,导致 List<Integer>
。由于Arrays.asList(1,2)
将隐式返回一个List<Integer>
。
您可以通过使用以下惯用语来解决此问题:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1l,2l));
Arrays.asList(1L, 2L)
的翻译是:将1L和2L以列表的形式放入数组中。 - Schidu Luca