2013-10-01 136 views
1

我想下面的代碼將編印「否」爲什麼會出現在此的instanceof測試編譯錯誤

class One{ 
public static void main(String[] args) { 

    One o = new One(); 
    if(o instanceof Two) { 
    System.out.println("Yes"); 
    } else { 
    System.out.println("No"); 
    } 
} 
} 

class Two { } 

但它扔我一個編譯器錯誤,指出inconvertible types 應該不是instanceof運營商檢查如果對象是在傳承層次,如果是返回truefalse如果沒有

編輯:

如果編譯器已經知道某個條件永遠無法真正的情況下,它拋出一個編譯器錯誤,這是爲什麼代碼編譯

if(false) { 
    System.out.println("Yes"); 
} 
+2

因爲它可以從類名中得知答案是錯誤的。聲明o是一個對象(但仍然創建一個)。 'Object o = new One();' –

+0

@fvrgl:我沒有看到那篇文章,我的不好。但你能看到我的編輯並提供解釋嗎? –

+0

您沒有違反if(false)情況下的任何規則。 –

回答

0

instanceof用於標識由另一個類的引用變量多態引用的對象,因此如果引用變量o無法引用類Two的對象,它將不會編譯。

所以這個:

One o = new One(); 
if(o instanceof Two) { 
    System.out.println("ok"); 
} 

爲例的問題是類似這樣的錯誤:

int i = 1; 
if (i == "s") { 
    System.out.println("ok"); 
} 

它不能編譯了!

編輯

多態性的例子,其中它會使你的代碼編譯(按其他的答案):

Object o = new One(); 

因爲o可以參考Two,所以instanceof會告訴你如果是的話。

4

您獲得的消息,因爲編譯器能夠告訴Ø不能是Two的實例,因爲類OneTwo沒有繼承關係。

也許你的意思是寫:

Object o = new One(); 

在這種情況下,你的測試纔有意義。

+0

請參閱我編輯的問題 –

4

我相信這是因爲你已經聲明你的「o」變量是「One」類型的變量。 你的代碼改成這樣,它應該編譯

Object o = new One(); 
    if(o instanceof Two) { 
    System.out.println("Yes"); 
    } else { 
    System.out.println("No"); 
    } 

instanceof運算符是爲了使用,當你不知道事先的類型。所以當你有一個通過方法參數傳入的東西的對象時,或者當你的變量被聲明爲一個基類的類型並且想要爲每個子類類型有不同的行爲時。在你提供的場景中,編譯器可以在編譯時告訴你,你寫的東西永遠不會是真的,並且這樣做。

編輯:if(false)編譯,因爲有很多人使用這樣的模式:

public class Application{ 

    private static final boolean DEBUG = true; 

    public static void main(String args[]){ 
     if(DEBUG){ 
      System.out.println("Debugging information"); 
     } 
    } 
} 

現在想象一下,其中在幾個地方重複這種模式的大型應用程序。如果編譯器拒絕編譯這個,那麼從切換到DEBUG模式將會困難得多。

在我之前的解釋中,也許我不應該使用「編譯器可以在編譯時告訴你的話,你寫的東西永遠不會是真的」。更好的描述是「編譯器可以告訴你所寫的內容沒有意義」。

+0

請參閱我編輯的問題 –

+0

我已編輯我的答案 – Moeri

-1

首先,對於上面的程序,你會得到「不兼容的條件操作數類型一個和兩個」,因爲一個和兩個沒有任何關係。

爲了使上述的事實,就應該像計劃的結果,

public class One { 
    public static void main(String[] args) { 

     One o = new Two(); 
     if (o instanceof Two) { 
      System.out.println("Yes"); 
     } else { 
      System.out.println("No"); 
     } 
    } 
} 

class Two extends One { 
} 

在這裏,一個是父母和兩個孩子是。父指向子對象,那麼操作符的前一個實例將返回true。

+0

即時消息不是要打印「是」 –

+0

正如我在評論中提到的,父母和孩子之間沒有任何關係。對於使用instanceOf,引用類型和Object之間應該有一些關係。在這裏,One和Two之間沒有關係。 –

相關問題