Java 为什么5.0==5L会返回一个true?
这将返回Java 为什么5.0==5L会返回一个true?,java,equality,Java,Equality,这将返回true! 它应该返回一个false值,因为正在比较两种不同的类型。 即使将double与long值进行比较 将longs与doubles进行比较时,将long提升为double,然后对两者进行比较。由于两者都等于5,因此结果为true这两个操作数将按照进行二进制数字升级,以获得两个操作数的单一类型 规则如下: 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8) 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数: 如果任一操作数的类型为double,则
true
!
它应该返回一个false
值,因为正在比较两种不同的类型。
即使将
double
与long
值进行比较 将long
s与double
s进行比较时,将long
提升为double
,然后对两者进行比较。由于两者都等于5,因此结果为true
这两个操作数将按照进行二进制数字升级,以获得两个操作数的单一类型
规则如下:
- 如果任何操作数是引用类型,则它将进行取消装箱转换(§5.1.8)
- 加宽基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:
- 如果任一操作数的类型为
,则另一个操作数将转换为double
double
- 如果任一操作数的类型为
第二个操作数的类型为
double
,因此long
值隐式转换为double
,然后比较两个double
值,并且它们相等。它返回true,因为它比较的是两种类型的“基本变量”。如果它们是相同的值,它就起作用了
相比之下,例如,如果引用的对象是同一个对象,则在“对象变量”上使用“==”返回true
System.out.println(" answer is " + (5.0==5L));
但是:
口味不同,但我实际上更喜欢这个表达而不是真的。现在发生的事情是将
long
转换为double
,然后以明显的方式进行比较。因为它们都碰巧是数字,而且实际上是在代码中调用比较,所以Java假设您希望将它们作为数字进行比较,转换long并尝试进行比较。使用编译(double==long
)但返回常量值(false
)的运算符有什么意义?使用带有取消装箱效果的==运算符可能会将右值转换为左值类型。在您的情况下,long被转换为double。这也是关于编译器的智能性。想想如果had 5.6==5LIt返回false
,您想要什么!可能是编译错误,但不是错误!
Object a = new Object();
Object b = a;
//then a==b is true
Object a = new Object();
Object b = new Object();
//then a==b is false