0

据我了解,如果我有两个longor int,则==测试值相等的运算符有时会由于自动装箱而无法工作。

==在处理原语时,我需要做些什么来确保它在所有可能的情况下都能正常工作?

4

3 回答 3

7

向后兼容性要求(并且 JLS 同意)如果您有类似的表达式

double a = ..
double b = ...
if (a == b) // condition

此条件必须以与自动装箱前和自动装箱后相同的方式工作。这意味着自动装箱不能也不能在这里应用。

事实上,如果可以使用拆箱代替,自动装箱永远不会用于编译 == 表达式。

Integer i = 1000;
int j = 1000;
System.out.println(i == j); // is true

在这种情况下,选择拆箱而不是装箱。

于 2013-10-30T15:28:29.120 回答
2

JLS (§15.21.1) 说:

如果相等运算符的操作数都是数字类型,或者一个是数字类型而另一个是可转换的(第 5.1.8 节)为数字类型,则对操作数执行二进制数字提升(第 5.6.2 节)。

请注意,二进制数字提升执行值集转换(第 5.1.13 节)并可能执行拆箱转换(第 5.1.8 节)。

因此,仅当两个操作数都是装箱类型(Double,Integer等)时,才会出现您描述的问题。操作数类型是否装箱取决于操作数的声明方式。如果是变量、字段或参数,则取决于用于声明名称的类型;如果是方法调用,则取决于声明方法时使用的返回类型;如果是其他操作的结果,比如+,它应该已经被拆箱;如果应用了类型转换,则转换会告诉您类型是什么。

==正如其他人所说,由于舍入错误,您通常不应该使用比较双精度数或浮点数。

于 2013-10-30T15:36:17.793 回答
0

Fafaik 你不能用两个原语来装箱。当您要采取(例如) and intand anInteger或 a doubleand a时,就会发生拳击Double。拆箱从“盒子”(等效对象)中获取原语,然后将两个原语与==运算符进行比较,在这种情况下,不能保证它们是相同的。但是,如果您有两个doubles,您将不会遇到此问题。

于 2013-10-30T15:27:17.027 回答