2017-04-01 58 views
1
class A {} 

class B {} 

public class Demo { 

    public static void main(String[] args) { 

     A a = new A(); 
     System.out.println(a instanceof B); 
    } 

} 

此代碼給出編譯時錯誤。 如何使用instanceof在object不是指定類的實例時給出false而不是編譯時錯誤。java中的運算符實例

+1

您是否在同一個文件中編譯了'class A'和'class B'? –

+3

嘗試用'Object a = new A();' – Pshemo

回答

4

Java知道A不能是B所以它不會編譯。如果更改行

Object a = new A(); 

它會編譯(並返回false),因爲它不再能告訴我們,如果一個Object可以轉換成B類型。

+0

我的意思是說如果對象是一個類的實例,那麼它的真實性就是真,如果不是,則爲false。但是當我嘗試第二種情況時,它不是給虛假給編譯時錯誤.......但由於定義說它有兩個值true和false,並且如果object不是類的一個實例,所以如果得到錯誤,它會給出false。 – Ankit

+0

當您將它與不相關的類型一起使用時,它永遠不會編譯。 'instanceof'適用於有問題的對象可以合法地成爲你正在測試的類型的情況。 'myBird instanceof Eagle' – hughjdavey

+2

@Ankit因爲編譯器知道根據類型A(與B無關)的規範變量不能容納B的實例,所以這樣的測試永遠不會返回true,所以即使寫入也沒有意義它。編寫這樣的代碼很可能基於不正確的假設,所以最好現在停止程序員而不是讓他錯誤。 – Pshemo

1

您可以使用此:

System.out.println(a.getClass().equals(B.class)); 

相反的:

System.out.println(a instanceof B); 
+0

thanx ....這對我來說是新的 – Ankit

+0

這不是相同。例如,'「」.getClass()。equals(Object.class)'爲false,但是''「instanceof Object'爲true。 'instanceof'匹配子類,'equals'不匹配。 –

2

如果class AB通過繼承是不相關的,那麼當你嘗試執行a instanceof B

編譯器將拋出一個錯誤

就你而言,A不是B的子類,所以你可以「T做一個instanceof檢查像a instanceof B

但是,如果你改變你的類象下面這樣:

class A {} 

class B extends A {} 

public static void main(String[] args) { 
    B b=new B(); 
    System.out.println(b instanceof A); 
} 

現在b instanceof A將返回true因爲B IS-A(類型)A

您可以閱讀關於相同主題的Java doc here

instanceof運算符將對象與指定類型進行比較。您可以使用它來測試對象是否是類的實例,子類的實例 或者實現特定接口的類的實例。

+0

非常感謝你 – Ankit

0

引用JLS Sec 15.20.2

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

(如果它們被描述RelationalExpression instanceof ReferenceType

你不能寫B b = (B) a;要麼,因爲AB都是類(*),並且是不相關的,在這個意義上A直接或間接不擴展B,反之亦然。

因此,對A的引用永遠不能包含B的實例,因此對此進行測試是無意義的。因此,編譯器會阻止您對此進行測試,因爲它可能表示出現邏輯錯誤。


(*),你可以寫a instanceof B如果B是一個接口,因爲a可能指的A子類,還實現了B,例如

class ChildOfA extends A implements B {} 
A a = new ChildOfA(); 
System.out.println(a instanceof B); // fine.