簡體   English   中英

了解 Object 的 == 運算符比較 Java

[英]Understanding == operator for Object Comparison in Java

我知道 == 運算符檢查相等的引用(地址),但是在比較ThreadString object 時,我沒有得到編譯器如何拋出錯誤。

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
  }

為什么它允許比較ThreadObject而不是ThreadString

指定比較無法在它們之間轉換的引用類型必須導致編譯錯誤。 請參閱JLS 第 15.21.3 章

15.21.3。 引用相等運算符 == 和 !=

[...]

如果無法通過強制轉換(第 5.5 節)將任一操作數的類型轉換為另一個操作數的類型,則會出現編譯時錯誤。 兩個操作數的運行時值必然不相等(忽略兩個值都為空的情況)。

盡管@Progman 已經很好地回答了它,但我想從另一個角度來看待它。

Thread extends Object ,因此說Object o = new Thread()現在String extends Object是有效的,但String不擴展Thread (因此String iDoNotComplie = new Thread()是有效的,但字符串不擴展

現在如果我們有Thread t = new Thread()那么如果我們有一個Object類型的引用, o和另一個String類型s引用,那么它可能是o實際上是指一個 object 的Thread但它是不可能s永遠參考Thread的 object 。 這使得o==s工作並且o==t也工作但s==t不起作用,因為它根本無法編譯。

簡單地說,這是因為Object可以是任何東西。 它是可變的,可以分配給多個事物。 正如@nits.kk 所解釋的,由於Thread extends Object並且String extends Object 這使得使用t == os == o成為可能,因為它們都被視為Object 但是, stringthread有很大不同,即使它們都是對象,它們也不屬於同一類別。 因此,它們無法進行比較,並且如@Progman 所述,它將引發編譯錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM