任何人都可以使用instanceof運算符在Java中解釋以下行爲。java中帶有接口的instanceof運算符
Runnable r = new Thread();
eventhough變量r的類型可運行,並instanceof的比較是不駐留在同一類層次結構類進行
任何人都可以使用instanceof運算符在Java中解釋以下行爲。java中帶有接口的instanceof運算符
Runnable r = new Thread();
eventhough變量r的類型可運行,並instanceof的比較是不駐留在同一類層次結構類進行
String
類是final
- 這意味着它可以」不要小看。此外,它不執行Runnable
。所有這些在編譯時已知;因此編譯錯誤。
一個例子:
static class First {
}
static final class Second {
}
而且比:
Runnable r = new Thread();
System.out.println(r instanceof First);
System.out.println(r instanceof Second);
編譯器看到的是Second
是final
,因此不能有任何sub-classes
,因此無法實現Runnable
。
String
類是final
而且它沒有實現Runnable
接口。因此,r instanceof String
永遠不會返回true(因爲不能有任何子類String
將執行Runnable
),這就是編譯器不允許它的原因。
在另一方面,也有可能是Vector
類或FileNotFoundException
類的子類,實現Runnable
接口,所以r instanceof Vector
和r instanceof FileNotFoundException
可以儘可能的編譯器可以告訴返回true。
這是通過JLS 15.20.2覆蓋:
如果RelationalExpression到引用類型的鑄造(§15.16)將被拒絕作爲一個編譯時間錯誤,那麼的instanceof關係式同樣產生一個編譯時錯誤。 在這種情況下,表達式instanceof的結果永遠不會是真的。
更重要的一點:'String'不實現'Runnable',它不能有*子類*這樣做(因爲它是'final')。 –
@ T.J.Crowder是+1這將是很好的編輯回答,使其更有用 –
@ErwinBolwidt:是的。我將它交給莫里斯。但無論如何,整件事情都是一個騙局,所以...... –