2013-08-31 84 views
16
class A { 

    public static void main(String...args) { 
     Integer var = 10; 

     if(var instanceof Character) // Line1 
      System.out.println("var is a Character"); 
    } 
} 

我知道1號線不能編譯,因爲編譯器發現,var不是CharacterJava中的instanceof - 爲什麼不編譯?

我不明白爲什麼編譯器會拋出一個錯誤,而不是返回falsetrue

如果編譯器返回falsetrue(即將instanceof操作看作是常規的基於if的驗證),那麼它會更有用。

或者我錯過了明顯的東西?

+3

將'Integer var = 10;'更改爲'Object var = 10;'。編譯器告訴你,如果你聲明它是一個Integer,那麼'var'可以**從不**成爲'instanceof Character'。 –

+5

爲什麼這會降低投票率?這是一個很合理的問題。 –

+0

@RohitJain我的想法。 –

回答

18

它是根據一個編譯錯誤與JLS §15.20.2

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

RelationalExpressioninstanceof引用類型的第一操作數是第二。

3

除了arshajii的回答如果你想避免編譯時錯誤,並希望運行時真/假結果用於檢查是否var爲特徵的實例,然後使用如下代碼:

if(var.getClass().isAssignableFrom(Character.class)) 
    System.out.println("var is a Character"); 
else 
    System.out.println("var is NOT a Character"); 

正如您所期望的那樣:

var is NOT a Character 
+3

我認爲JLS的基本點是,如果您知道該類型不可分配,則此檢查可以**從不**返回「true」。這完全沒有意義 - 如果你知道它是一個Integer,那麼這個檢查是多餘的,return false也可以。如果你不知道'var'是一個'Integer',即你有一個'Object',那麼'instanceof'就會編譯得很好。 –

+1

它是有用的,如果我想在某些情況下做更少的代碼。我在開發階段和嵌入式模式下都有人工交叉項目,我使用'if(這個XWalkActivity的實例)'來檢查,但是它編譯錯誤。 '的https:// crosswalk-project.org /文檔/ shared_mode.html' –