【问题标题】:For a List<Long> in Java, do you have to cast primitive long into Long before adding it?对于 Java 中的 List<Long>,在添加之前是否必须将原始 long 转换为 Long ?
【发布时间】:2014-08-10 18:34:28
【问题描述】:

如果您有List&lt;Long&gt; list,您是否必须将原始长型转换为长型?

你必须这样做吗

long l = -1; list.add( (Long) l);

或将

list.add(l);

没问题,不会导致任何异常/错误?

【问题讨论】:

  • 当你尝试时会发生什么?
  • 来吧,试一试肯定比问SO快吗?
  • 如果您想知道为什么我们不需要投射,请阅读有关自动装箱和自动拆箱的信息。
  • 你需要了解java中的原语、包装类、自动装箱和拆箱。
  • 我知道包装类,但我不知道有自动装箱和拆箱之类的东西,谢谢!

标签: java list arraylist casting


【解决方案1】:

不需要将原始类型long 转换为对象包装类Long 编译器会处理它。它被称为自动装箱。

正如 JavaDoc 所说:自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换。例如,将 int 转换为 Integer,将 double 转换为 Double,等等。如果转换以另一种方式进行,则称为拆箱。。请refer

考虑以下代码:

List<Integer> list = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    list.add(i);

尽管您将 int 值作为原始类型而不是 Integer 对象添加到列表中,但代码仍然可以编译。因为 list 是 Integer 对象的列表,而不是 int 值的列表,您可能想知道为什么 Java 编译器不发出编译时错误。编译器不会生成错误,因为它会从 i 创建一个 Integer 对象并将该对象添加到列表中。因此,编译器在运行时将之前的代码转换为以下代码:

List<Integer> list = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    list.add(Integer.valueOf(i));

【讨论】:

    【解决方案2】:

    不,你没有,int 原语将是 AutoBoxed

    【讨论】:

      【解决方案3】:

      我假设您的 java 版本 > 1.5,因为您使用了通用列表。

      所以在你的情况下,list.add(l); 可以工作

      不要害怕在本地机器上尝试这些东西。

      在此处阅读更多信息:Autoboxing and Unboxing

      【讨论】:

        猜你喜欢
        • 2019-07-31
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 2014-03-25
        • 2011-09-04
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多