理解 Java 中对象比较的 == 运算符

Rah*_*pta 11 java

我知道 == 运算符检查相等的引用(地址),但我没有得到编译器在比较ThreadString对象时如何抛出以下错误。

java: incomparable types: java.lang.Thread and java.lang.String

这是我的代码:

public static void main(String[] args) {
    Thread t = new Thread();
    Object o = new Object();
    String s = new String("");

    System.out.println(t == o);//no issues here

    System.out.println(t==s);// but this throws above error
  }
Run Code Online (Sandbox Code Playgroud)

为什么它允许在ThreadandObject但不允许Thread和之间进行比较String

Pro*_*man 15

指定比较不能在它们之间转换的引用类型必须导致编译错误。请参阅JLS 第 15.21.3 章

15.21.3. 引用相等运算符 == 和 !=

[...]

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


nit*_*.kk 11

虽然@Progman 已经很好地回答了它,但我想换个角度来看待它。

Thread extends Object, 因此说Object o = new Thread() Now是有效的String extends Object,但String不扩展Thread因此String iDoNotComplie = new Thread()无效。

现在,如果我们有Thread t = new Thread()那么如果我们有类型的引用Objecto 和类型的另一个参考Strings那么它可能是o实际上是指的一个对象Thread,但它不可能s永远参考的对象Thread。这可以o==s工作,o==t也可以工作,但s==t不起作用,因为它根本无法编译。

  • 支持也解释为什么它们不能相互转换 (2认同)