【问题标题】:Initialize ArrayList<Long>初始化 ArrayList<Long>
【发布时间】:2018-03-15 20:23:03
【问题描述】:

为什么我可以像这样初始化ArrayList:

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

但使用时出错:

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

【问题讨论】:

  • 数字默认为 int,因此当 java 尝试自动装箱 1 和 2 时,它会将其转换为包装器类型 Integer,而 Integer 与 Long 不同或与 Long 不同
  • Arrays.asList(1L, 2L)
  • 1,2 是整数,不是长整数

标签: java arrays list arraylist long-integer


【解决方案1】:

因为Arrays.asList(1,2) 将隐式返回List&lt;Integer&gt;

您可以使用以下习语来解决此问题:

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

【讨论】:

    【解决方案2】:

    这是因为12 是整数,而Arrays.asList(1, 2) 创建了一个List&lt;Integer&gt;

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

    您有多种选择,但最简单的一种是通过添加L 后缀将ints 更改为longs:

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

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

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

    【讨论】:

    • 值得一提的是,java 9 版本与 Arrays.asList 相似,因为它返回一个不可变的 List - 如果您希望 x 是可变的,您仍然需要复制构造函数。
    • 只是为了避免混淆 - 我知道Arrays.asList 返回的列表是可变的,但大小固定。 this question 的答案也可能会引起未来读者的兴趣。
    【解决方案3】:

    您必须使用文字 lL 指定一个 Long 数字。

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

    否则12 被理解为整数,结果为List&lt;Integer&gt;

    【讨论】:

      【解决方案4】:

      说明

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

      但是,如果需要从 IntegerLong 的转换,Java 不会这样做

      函数Arrays.asList(...) 返回一个List&lt;E&gt;,其中E 是用作参数的类型。当您使用1, 2, 3 时,类型为int。然而,data-types 作为List&lt;int&gt; 的通用用法在Java 中是不可能的(至少目前是这样)。因此它会自动将int 转换为Integer 并生成List&lt;Integer&gt; 对象。这个过程称为自动装箱,Java 可以对所有数据类型执行此操作以使其对应的对象表示。

      如果您现在使用构造函数new ArrayList&lt;Integer&gt;(List&lt;E&gt; list),它期望EInteger 类型的东西。所以List&lt;Integer&gt; 可以作为输入。

      但是当你使用new ArrayList&lt;Long&gt;(List&lt;E&gt; list) 时,显然E 需要是Long 类型。但是对象Integer不是类型 Long,因此它确实不接受参数。 IntegerLong 的第一个常见类型是抽象类Number(它还包含DoubleFloat 等)(documentation)。


      解决方案

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

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

      现在您收到List&lt;Long&gt;,然后将其添加到ArrayList&lt;Long&gt;


      请注意,可以使用相同的技术将十进制数显式解释为 float 而不是 double1.5F1.5f

      【讨论】:

      • 需要注意的是,asList 返回一个自定义的固定大小 ArrayList不是 java.util.ArrayList
      • @Oleg 你是对的,不知道。我将从答案中删除注释,因为它没有那么有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-05
      • 1970-01-01
      • 2018-09-04
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多