2013-04-07 86 views
3

爲什麼我可以使用instanceof對我的自定義界面測試我的自定義類,並且我無法對java核心類執行相同操作?instanceof with custom/core classes

interface A{} 
class B{} 
public class Tmp { 
    public static void main(String [] args) { 
     String s = ""; 
     Integer i = 1; 
     B b = new B(); 
     System.out.println(s instanceof A); //1 
     System.out.println(i instanceof A); //2 
     System.out.println(b instanceof A); //3 
    } 
} 

第1行和第2行不會編譯。第3行將編譯(並打印false)。有什麼不同?

+0

你讀過[this](http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html)文章嗎? – Bernard 2013-04-07 13:44:05

+0

@Bernard,是的,我讀過這個。它沒有回答我的問題。 – 2013-04-07 13:47:59

回答

4

如果編譯器可以檢測到instanceof操作永遠不會成立,它將產生編譯器錯誤。它通過遵循與鑄造相同的規則來確定這一點。特定規則在JLS的Section 15.20.2描述:

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

+0

是的,我明白了!這是因爲'String'和'Integer'都是final類,因此'String'或'Integer'引用的對象永遠不能實現'A'。 'B'(或'HashMap')不是最終的,所以它們的子類可能會實現'A',所以編譯器不能確定這種比較是沒有意義的。 – 2013-04-07 13:53:39