为什么我可以像这样初始化 ArrayList:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
但是在使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
原文由 Luke 发布,翻译遵循 CC BY-SA 4.0 许可协议
为什么我可以像这样初始化 ArrayList:
ArrayList<Integer> x = new ArrayList<Integer>(Arrays.asList(1,2));
但是在使用时出现错误:
ArrayList<Long> x = new ArrayList<Long>(Arrays.asList(1,2));
原文由 Luke 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
解释
如果需要,Java 会自动将
int
转换为long
。但是,如果需要从
Integer
到Long
的转换,Java 不会这样做。函数
Arrays.asList(...)
返回一个List<E>
E
用作参数的类型。当您使用1, 2, 3
时,类型为int
。然而, 数据类型 的一般用法如List<int>
在 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
因此它不 接受 参数。 The first common type ofInteger
andLong
is the abstract classNumber
(which also holdsDouble
,Float
和其他)( 文档)。解决方案
所以这一切都围绕输入
1, 2, 3
被解释为int
而不是long
。您可以通过 明确 告诉 Java 将数字 解释 为long
来解决此问题,您可以通过在数字后附加l
或L
:--- 来解决此问题现在你收到一个
List<Long>
然后被添加到一个ArrayList<Long>
。Note that the same technique can be used to explicitly interpret decimal numbers as
float
instead ofdouble
:1.5F
or1.5f