即使我将列表设置为 Long 类型,我仍然可以做到这一点而不会出现任何错误。有什么我应该知道的潜在问题吗?
long num = 12L;
List<Long> list = new ArrayList<Long>();
list.add(num)
不会。原始 long 将自动装箱为 Long。
可能导致问题的是反向操作:
long foo = list.get(0);
这会将 Long 拆箱为 long,如果 null 存储在列表中,则会抛出 NullPointerException。
没有问题。Autoboxing
在java中有一种叫做as的东西。
这个链接会帮助你。
根据 JLS -
正如任何 Java 程序员都知道的那样,您不能将 int(或其他原始值)放入集合中。集合只能保存对象引用,因此您必须将原始值装入适当的包装类(在 int 的情况下为 Integer)。当你从集合中取出对象时,你会得到你放入的 Integer;如果需要 int,则必须使用 intValue 方法对 Integer 进行拆箱。所有这些装箱和拆箱都是一种痛苦,并且会使您的代码混乱。自动装箱和拆箱功能使过程自动化,消除了痛苦和混乱。
有什么我应该知道的潜在问题吗?
不,不会有任何问题。Java 1.5+ 版本的编译器将在这种情况下执行自动装箱long
以将文字转换为Long
对象。
但是,在执行自动拆箱(From Long
to )时应该小心long
,因为拆箱null
引用将导致NPE
.
例如:
list.add(null);
long val = list.get(0); // NPE will be thrown here.
这没有问题,因为(现代版本的)Java 可以在这种情况下自动在对象和原始类型之间进行转换。它被称为自动装箱。