Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确保==始终作为相等测试使用原语_Java_Equals_Equality_Primitive_Autoboxing - Fatal编程技术网

Java 如何确保==始终作为相等测试使用原语

Java 如何确保==始终作为相等测试使用原语,java,equals,equality,primitive,autoboxing,Java,Equals,Equality,Primitive,Autoboxing,据我所知,如果我有两个long或int,用于测试值相等性的=运算符有时由于自动装箱而无法工作 在处理基本体时,我需要做些什么来确保==在任何可能的情况下都能工作?Fafaik您无法使用两个基本体进行装箱。装箱发生在您要取(例如)和int和Integer或double和double时。取消装箱从“框”(对象等价物)获取原语,然后用=运算符比较这两个原语,在这种情况下,不能保证它们是相同的。如果您有两个doubles,则不会出现此问题。向后兼容性要求(JLS同意)如果您有如下表达式 double a

据我所知,如果我有两个
long
int
,用于测试值相等性的
=
运算符有时由于自动装箱而无法工作


在处理基本体时,我需要做些什么来确保
==
在任何可能的情况下都能工作?

Fafaik您无法使用两个基本体进行装箱。装箱发生在您要取(例如)和
int
Integer
double
double
时。取消装箱从“框”(对象等价物)获取原语,然后用
=
运算符比较这两个原语,在这种情况下,不能保证它们是相同的。如果您有两个
double
s,则不会出现此问题。

向后兼容性要求(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
等)时,才会出现您描述的问题。操作数类型是否装箱取决于操作数的声明方式。如果是变量、字段或参数,则取决于用于声明名称的类型;如果是方法调用,则取决于声明方法时使用的返回类型;如果它是其他操作的结果,如
+
,则应该已经解除绑定;如果应用了类型转换,该转换将告诉您类型是什么


正如其他人所说,由于舍入错误,通常不应该使用
==
来比较double或float。

如果两个操作数都是基元类型,它不会装箱…AIUI,将
double
值与
=
进行比较很少是一个好主意。有一些info@DuncanJones这是来自
int
long
的typecast
double
您能提供一个触发您所描述问题的代码示例吗?不,这是错误的。如果您比较一个
double
和一个
double
,它将取消对
double
的装箱,而不是将
double
装箱。很抱歉,您完全正确-我将立即更改此项。语句
自动装箱从未用于编译==表达式
不完全正确。如果
a
被声明为
对象
并且
b
被声明为
int
a==b
将自动装箱
b
整数