我是JAVA的新手并且正在通过相等运算符。在尝试了几个操作数组合之后,我对Java中相等运算符(==)的兼容操作数的定义究竟是什么感到困惑。
int x = 23;
if (x == 23.3f) { // compiler accepts it. (may be because both are primitives)
int x = 23;
Double d = new Double(23.3);
if (x == d) { // compiler accepts it. (may be compatible pair of primitive and object reference)
int x = 23;
String s = "hello";
if (x == s) // compiler throws error - incompatible operands for == operator.
所以,在我看来,对于相等运算符应该有一些正确的兼容操作数定义。请帮我澄清这个疑问。
答案 0 :(得分:1)
对于
int x = 23;
if (x == 23.3f)
如果使用javap -v
查看字节代码,int
将转换为float
。即,i2f
将被调用,然后使用fcmpl
将它们作为2个浮点值进行比较。
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 23
2: istore_1
3: iload_1
4: i2f // The line of interest. Converts int to float.
5: ldc #16; //float 23.3f
7: fcmpl // compare two floats
8: ifne 11
11: return
在第三种情况下,您将基元与Object(String)进行比较,这是不可能的。
答案 1 :(得分:0)
编译器接受它,因为x
和23.3f
具有原始数字类型。比较将返回false
。
编译器接受它,因为java unboxes Double
在比较时反对double
原语。
编译器无法接受它,因为x
是原始数字类型,s
是对String
类实例的引用。无法比较数字原语和对象的引用。
答案 2 :(得分:0)
字符串是对象。
==
按引用比较对象,而不是按内部值比较。
所有其他(int, double)
在==
中通过对象引用进行比较,因此在字符串的情况下它不匹配所以对于字符串我们必须u .equals
运算符也是java区分大小写,所以在比较字符串时你必须照顾Case's of strings
答案 3 :(得分:0)
等价运算符暗含一些限制和转换,规则相当大,并在语言规范https://docs.oracle.com/javase/specs/jls/se11/html/jls-15.html#jls-15.21
中进行了描述也可能发生编译时错误,因为类类型是不相关的(也就是说,它们是不相同的,并且两者都不是另一个的子类),因此它们之间的强制转换将始终失败。 关于类型与某种接口类型的比较,编译器允许进行任何比较,除非一个变量永远不能引用实现该接口的值,这是因为类型是最终类型,而最终类型的变量始终包含一个运行时类型与其编译时类型相同的值。因此,变量的运行时类型必须与未实现指定接口的类型完全相同。