[英]Understanding == operator for Object Comparison in Java
我知道 == 運算符檢查相等的引用(地址),但是在比較Thread
和String
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
}
為什么它允許比較Thread
和Object
而不是Thread
和String
?
指定比較無法在它們之間轉換的引用類型必須導致編譯錯誤。 請參閱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 == o
和s == o
成為可能,因為它們都被視為Object
。 但是, string
與thread
有很大不同,即使它們都是對象,它們也不屬於同一類別。 因此,它們無法進行比較,並且如@Progman 所述,它將引發編譯錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.