整数长
^ ^
| | 自动装箱/自动拆箱
| |
vv
int ------------------------------------> 长
原始促销
此模式显示Java 可以在不同事物之间进行哪些隐式转换。
在 Java 中,不幸的是,对象和原语是不同的野兽:Long
而且long
不是同一种东西。long
从to的隐式转换Long
称为自动装箱。Long
从to的隐式转换long
称为自动拆箱。Java 语言规范的 5.1.8 节描述了这种转换。
此外,与许多其他语言一样,Java 具有数字类型之间的隐式转换。如果 An在包含其他s的表达式中使用,则它会int
被隐式提升为 a 。Java 语言规范的第 5.6 节描述了这些提升可能发生的上下文。long
long
请注意,1
Java 中的文字有 type int
。litteral1L
有 type long
。
Long v = ...
if(v == -1) ...
v
是一个Long
并且-1
是一个int
。Java 不知道如何比较对象和原语:它依靠其隐式转换规则来做到这一点。在这里,-1
被转换(自动装箱)为Integer
. 因此,我们正在比较两个甚至不具有相同类型的对象的引用:测试失败。
Long v = ...
if(v.equals(-1)) ...
这和上面是一样的,只是触发隐式转换的不是比较,而是方法调用。equals
将 anObject
作为参数,因此-1
被转换(自动装箱)为Integer
. Java 语言规范的 5.3 节描述了由方法调用触发的隐式转换。
Long v = ...
if(v.equals(new Long(-1))) ...
这里我们Long.equal
以a为参数调用方法Long
,所以测试成功。
那么,什么比较有效呢?
Long v = ...
if(v.equals(-1L)) ...
-1L
是一个long
。它被传递给需要 a 的方法Object
,因此它被隐式转换(自动装箱)为 a Long
。测试成功。
Long v = ...
if(v.longValue() == -1) ...
v.longValue()
是一个long
,-1
是一个int
。因为运营商-1
而被提升为a 。测试成功。long
==