当前位置: 首页 > 知识库问答 >
问题:

当使用==运算符比较包装类和原语时,类型转换背后的逻辑是什么?

柳高卓
2023-03-14

我了解到,当需要执行多个操作来执行隐式转换(int)时,编译器拒绝使用自动装箱/取消装箱-

Integer i = 2;
Double d = 2.0;
System.out.println(i == d); // COMPILE TIME ERROR

// fix

System.out.println( (double) i == d); // OK: true

我的理解是编译器试图用Integer.intValue()来解包i。因为它需要一个以上的步骤来转换整数到双(整数-

Integer i = 2;
double d = 2.0;
System.out.println(i == d); // OK: true

在本例中,编译器执行转换(Integer)显然需要多个步骤-

我知道必须使用equals()方法,而不是=


共有1个答案

许博
2023-03-14

答案可以在Java语言规范第15.21节中找到。相等运算符

运算符==(等于)和!=(不等于)被称为相等运算符。

第15.21.1节。数值相等运算符=== 表示:

如果一个等号操作符的操作数都是数字类型,或者一个是数字类型,另一个可转换为数字类型(§5.1.8),则对操作数执行二进制数字提升(§5.6)。

第15.21.3节。引用相等运算符=== 表示:

如果等号操作符的操作数都是引用类型或空类型,则该操作是对象相等的。

如果无法通过强制转换将任一操作数的类型转换为另一个操作数的类型(§5.5),则为编译时错误。两个操作数的运行时值必然不相等(忽略两个值均为null的情况)。

如果没有强制转换,i==d表达式必须遵循第15.21.3节中的规则,因为id都是引用类型,而不是数字类型。只有基元类型是数字类型(当然,除了布尔型)。

由于整数不能转换为双精度双精度不能转换为整数,编译器知道表达式不可能为真(忽略两个值均为null)的情况,因此会发生编译类型错误。

如果执行(double)i==d,则左侧将变为数字类型,并且第15.21.1节中指定的规则适用。

 类似资料:
  • 我正试图从现实中解决一个问题 “偶数总和” 但是我不能这样做。下面是问题。 即使是总和也是两个玩家的游戏。玩家将获得N个正整数序列并轮流进行。在每个回合中,玩家选择一个非空切片(连续元素的子序列),使得该切片中的值之和是偶数,然后删除切片并连接序列的其余部分。第一个无法做出合法举动的玩家将输掉比赛。 如果你和你的对手玩这场游戏,你想知道你是否能赢,假设你和对手都玩得很好。你先走。 写一个函数:

  • 是否有人理解对每个PowerShell的比较运算符进行区分大小写和不区分大小写版本背后的原因?为什么要使默认值不区分大小写? 例如,以-eq和-ceq为例。这些运算符用于比较所有类型,而不仅仅是字符串。那么,0-CEQ1意味着什么呢?如何区分大小写比较两个整数?

  • 问题内容: 当比较两个字符串时,我被告知不应使用逻辑运算符(==)。我们应该使用String.equals(String)进行比较。但是,我看到以下代码符合最新的JDK(1.6_23)并打印出来。我尝试四处搜寻,但找不到任何参考。从什么时候开始发生的? 问题答案: 您不应该使用它,因为它会做其他事情,然后您认为。 在这种情况下,“ hello”将被保存(在字符串插入中读取),因此与您的搅动相同的是

  • 本文向大家介绍什么是JavaScript中的逻辑运算符?,包括了什么是JavaScript中的逻辑运算符?的使用技巧和注意事项,需要的朋友参考一下 JavaScript支持以下逻辑运算符。假设变量A持有10,变量B持有20,那么, 序号 运算符和说明 1 &&(逻辑与) 如果两个操作数都不为零,则条件变为true。 例如:(A && B)是真的。 2 | | (逻辑或) 如果两个操作数中的任何一个

  • 这两条线有什么区别 和 或者