根据我的理解,如果我有两个long
或int
,则有时会因自动装箱而无法使用==
运算符来测试值的相等性。
在处理原语时,我需要做些什么才能确保==
在每种可能的情况下都有效?
答案 0 :(得分:7)
向后兼容性要求(和JLS同意),如果你有一个像
这样的表达式double a = ..
double b = ...
if (a == b) // condition
此条件必须与自动装箱前的方式相同,就像自动装箱后一样。这意味着自动装箱不能也不能在这里适用。
实际上,如果可以使用取消装箱,则自动装箱从不用于编译==表达式。
Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true
在这种情况下,选择取消装箱而非拳击。
答案 1 :(得分:2)
JLS(§15.21.1)说:
如果等于运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第5.1.8节)是数字类型,则对操作数执行二进制数字提升(第5.6.2节) )。
请注意,二进制数字促销执行值集转换(第5.1.13节)并可执行拆箱转换(第5.1.8节)。
因此,只有当两个操作数都是盒装类型(Double
,Integer
等)时,才会出现您描述的问题。操作数类型是否装箱取决于操作数的声明方式。如果它是变量,字段或参数,则取决于用于声明名称的类型;如果它是一个方法调用,它取决于声明方法时使用的返回类型;如果它是+
之类的其他操作的结果,则它应该已经取消装箱;如果已应用类型转换,则演员将告诉您类型是什么。
正如其他人所说,由于四舍五入错误,你通常不应该使用==
来比较双打或浮点数。
答案 2 :(得分:0)
Fafaik你不能用两个原始拳击。拳击发生在您(例如)和int
以及Integer
,double
和Double
时。取消装箱从“框”(等效的对象)中获取原语,然后将两个基元与==
运算符进行比较,在这种情况下,不能保证它们是相同的。如果您有两个double
,那么您将不会遇到此问题。