2014-01-22 69 views
5

我知道當對象是特定類的實例時,instanceof返回TRUE。例如:什麼時候instanceof返回FALSE?

B extends A 
C extends A 

B b = new B(); 
C c = new C(); 

b instanceof A // returns TRUE 

到目前爲止好,讓我們進入的東西會像它應該返回false:

c instanceof B // won't compile (error: inconvertible types) 

這並不編譯,這是有道理的,因爲它允許監督,在編譯時被捕。但是,當DOES instanceof實際返回false?看來只有兩個選項是TRUE和ERROR。我能想到的唯一的例外是:

null instanceof A // returns FALSE 

但通過與上述相同的邏輯,似乎本應在編譯時被捕獲爲好。

我在這裏錯過了什麼?真/假是唯一的實際選擇,還是有可能以更有意義的方式實際返回false,除了將null指定爲參考變量?

+0

這是狩獵的拼寫檢查器。考慮上面的僞代碼。 ;) – abc32112

+0

[''instanceof'運算符用於什麼?](http://stackoverflow.com/questions/7313559/what-is-the-instanceof-operator-used-for) –

+0

'(Object) c instanceof B'會編譯。 'c instanceof B'沒有編譯的原因是編譯器可以靜態確定對'C'的引用永遠不可能是'B'。 – Radiodef

回答

8

這裏的計算結果爲假的例子:

class A {} 
class B extends A {} 

A a = new A(); 
a instanceof B // false 

現場演示:http://ideone.com/cQltqE

3

下面是返回false

public static void main(String[] args) { 
    checkType(""); 
} 

static <T> void checkType(T sometype) { 
    System.out.println(sometype instanceof A); 
} 

static class A {} 

試圖比較(再投),以更具體的類型時,這是真正唯一有用的另一個例子。

在你的榜樣,

c instanceof A 

因爲類型C是不是在A繼承層次是沒有意義的。

5

除了其他的答案:的任何時間在左邊,或在右邊的類型的表達,是一個接口,然後instanceof可以是真實的,因此編譯器具有允許它。所以很容易提出一些錯誤的例子。

0
B extends A 
C extends A 

B b = new B(); 
C c = new C(); 

b instanceof A // returns TRUE 
myMethod(b); // has TRUE and then FALSE 
myMethod(c); // has FALSE and then TRUE 

void myMethod(A a){ 
    if(a instanceof B){System.out.println("This is a B");}//first statement 
    if(a instanceof C){System.out.println("This is a C");}//second statement 
} 

myMethod(b)通話,如果在這個方法的第二份聲明的評價將是FALSE並將打印這是B。然而在myMethod(c)呼叫如果在這個方法的第一條語句評估將是FALSE並將打印這是一個C

相關問題