2017-08-10 41 views
0

任何人都可以使用instanceof運算符在Java中解釋以下行爲。java中帶有接口的instanceof運算符

Runnable r = new Thread(); 

eventhough變量r的類型可運行,並instanceof的比較是不駐留在同一類層次結構類進行

回答

3

String類是final - 這意味着它可以」不要小看。此外,它不執行Runnable。所有這些在編譯時已知;因此編譯錯誤。

+2

更重要的一點:'String'不實現'Runnable',它不能有*子類*這樣做(因爲它是'final')。 –

+0

@ T.J.Crowder是+1這將是很好的編輯回答,使其更有用 –

+0

@ErwinBolwidt:是的。我將它交給莫里斯。但無論如何,整件事情都是一個騙局,所以...... –

1

一個例子:

static class First { 

} 

static final class Second { 

} 

而且比:

Runnable r = new Thread(); 

    System.out.println(r instanceof First); 

    System.out.println(r instanceof Second); 

編譯器看到的是Secondfinal,因此不能有任何sub-classes,因此無法實現Runnable

0

String類是final而且它沒有實現Runnable接口。因此,r instanceof String永遠不會返回true(因爲不能有任何子類String將執行Runnable),這就是編譯器不允許它的原因。

在另一方面,也有可能是Vector類或FileNotFoundException類的子類,實現Runnable接口,所以r instanceof Vectorr instanceof FileNotFoundException可以儘可能的編譯器可以告訴返回true。

這是通過JLS 15.20.2覆蓋:

如果RelationalExpression到引用類型的鑄造(§15.16)將被拒絕作爲一個編譯時間錯誤,那麼的instanceof關係式同樣產生一個編譯時錯誤。 在這種情況下,表達式instanceof的結果永遠不會是真的