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