2016-08-11 51 views
0

有人可以解釋這一點。 當實例沒有可能的方式引用對象時,java instanceof運算符會給出編譯器錯誤。精細。java instanceof運算符不兼容的條件編譯錯誤說明

讓我介紹了一下示例代碼

public class InstanceOfConfusing { 

class A {} 
class B1 extends A {} 
class B2 extends A {} 

public static void main(String... args) { 

    InstanceOfConfusing ioc = new InstanceOfConfusing(); 

    A a = ioc.new A(); 
    B1 b1 = ioc.new B1(); 
    B2 b2 = ioc.new B2(); 

    boolean t1 = b1 instanceof A; // compiles, true 
    boolean t2 = b1 instanceof B1; // compiles, true 

    boolean t3 = b1 instanceof B2; // does not compile 

    boolean t4 = a instanceof B1; // compiles, false *** 

} 

}

我明白,只是標有***的最後一行的一切。我的問題很簡單,爲什麼編譯? 如果編譯在前一行提供了「不兼容的條件操作數類型」錯誤,因爲沒有辦法讓類型爲B1的對象曾經引用類型爲B2的實例,那麼它不應該也不知道 也知道沒有辦法爲B1指的是A?

我不能寫這樣的一行:b1 = new A(); 我會得到一個「類型不匹配」的編譯器錯誤,正確如此。那麼爲什麼編譯器不知道這裏沒有辦法讓b1引用A類型的實例?我誤解了什麼?

回答

0

您可以指定向下轉換。這樣做後,您可以瞭解a instanceof B1的使用情況以及爲什麼需要編譯它。

B1 b = (B1) new A();

+0

實際上,instanceof關鍵字是上傳後的向下轉換。 –

+0

你完全正確! – user3627600

0

我認爲這是因爲B1延伸的,所以你可以這樣做:因此,與a instanceof B1

A a = new B1() 

,您可以檢查是否在爲包裹(例如)B1的實例抽象類A的接口