初始化 ArrayList<Long>

新手上路,请多包涵

为什么我可以像这样初始化 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 许可协议

阅读 1.5k
2 个回答

解释

如果需要,Java 会自动将 int 转换为 long

但是,如果需要从 IntegerLong 的转换,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 of Integer and Long is the abstract class Number (which also holds Double , Float 和其他)( 文档)。


解决方案

所以这一切都围绕输入 1, 2, 3 被解释为 int 而不是 long 。您可以通过 明确 告诉 Java 将数字 解释long 来解决此问题,您可以通过在数字后附加 lL :--- 来解决此问题

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

现在你收到一个 List<Long> 然后被添加到一个 ArrayList<Long>


Note that the same technique can be used to explicitly interpret decimal numbers as float instead of double : 1.5F or 1.5f

原文由 Zabuzard 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是因为 12 Arrays.asList(1, 2) List<Integer>

ArrayList 的复制构造函数要求参数是相同的泛型类型。

您有多种选择,但最简单的方法是通过添加 L 后缀将 --- 更改为 int long :—

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

请注意,对于 Java 9,您还可以编写:

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

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题