例如:
Long objectLong = 555l;
long primitiveLong = 555l;
System.out.println(objectLong == primitiveLong); // result is true.
是否有调用objectLong.longValue()方法来比较Long或long或者其他某种方式?
答案 0 :(得分:4)
与以往一样,Java语言规范是咨询的适当资源
来自JLS 15.21.1(“数字平等算子==和!=”):
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。
请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。
然后从5.6.2(二进制数字促销):
当运算符将二进制数字提升应用于一对操作数时,每个操作数必须表示可转换为数字类型的值,以下规则适用:
- 如果任何操作数属于引用类型,则进行拆箱转换(第5.1.8节)。
- [...]
因此Long
已取消装箱到long
。您的代码相当于:
Long objectLong = 555l;
long primitiveLong = 555l;
// This unboxing is compiler-generated due to numeric promotion
long tmpLong = objectLong.longValue();
System.out.println(tmpLong == primitiveLong);