1

即使我将列表设置为 Long 类型,我仍然可以做到这一点而不会出现任何错误。有什么我应该知道的潜在问题吗?

long num = 12L;
List<Long> list = new ArrayList<Long>();
list.add(num)
4

4 回答 4

9

不会。原始 long 将自动装箱为 Long。

可能导致问题的是反向操作:

 long foo = list.get(0);

这会将 Long 拆箱为 long,如果 null 存储在列表中,则会抛出 NullPointerException。

于 2013-07-01T21:49:15.613 回答
4

没有问题。Autoboxing在java中有一种叫做as的东西。

这个链接会帮助你。

根据 JLS -

正如任何 Java 程序员都知道的那样,您不能将 int(或其他原始值)放入集合中。集合只能保存对象引用,因此您必须将原始值装入适当的包装类(在 int 的情况下为 Integer)。当你从集合中取出对象时,你会得到你放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。

于 2013-07-01T21:48:20.840 回答
2

有什么我应该知道的潜在问题吗?

不,不会有任何问题。Java 1.5+ 版本的编译器将在这种情况下执行自动装箱long以将文字转换为Long对象。

但是,在执行自动拆箱(From Longto )时应该小心long,因为拆箱null引用将导致NPE.

例如:

list.add(null);
long val = list.get(0);  // NPE will be thrown here.
于 2013-07-01T21:47:46.983 回答
1

这没有问题,因为(现代版本的)Java 可以在这种情况下自动在对象和原始类型之间进行转换。它被称为自动装箱。

于 2013-07-01T21:47:53.630 回答