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