2010-12-16 29 views
6

我讀這樣的:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2爲2個不兼容的類使用時,爲什麼`instanceof`錯誤而不是返回`false`?

他們說:

考慮的示例程序:

class Point { int x, y; } 
class Element { int atomicNumber; } 
class Test { 
     public static void main(String[] args) { 
       Point p = new Point(); 
       Element e = new Element(); 
       if (e instanceof Point) {  // compile-time error 
         System.out.println("I get your point!"); 
         p = (Point)e;   // compile-time error 
       } 
     } 
} 

instanceof表達不正確,因爲沒有Element實例或其任何可能的子類(這裏沒有顯示)可能是Point的任何子類的實例。

爲什麼這會導致錯誤,而不是簡單地在instanceof返回false?

感謝,

JDelage

+0

這聽起來像你以前的經驗可能與大多數鬆散類型和主要解釋的語言(例如:大多數BASIC),而不是強類型和編譯。使用大多數解釋的語言,幾乎所有的類型驗證都在運行時發生。但是,對於編譯語言,編譯器能夠完成相當多的「類型和執行流分析」。因此,如果發現永遠不能執行的路徑,它可以刪除該路徑中的代碼(即去除死代碼)。如果它發現一個不可能成功的操作,就會產生一個錯誤。 – chaotic3quilibrium 2010-12-16 16:36:59

回答

10

instanceof檢查是一個運行時檢查。編譯器能夠在編譯時(很早)發現這種情況是不正確的,所以它告訴你它是錯誤的。永遠記住,快速失敗是一種好習慣,它會爲你節省很多時間和精力。

+1

謝謝 - 這解釋了這個決定的合理性。實際上,在編譯時錯誤而不是在運行時產生「錯誤」結果是完全有意義的。 – JDelage 2010-12-16 11:45:24

10

我說,因爲你知道在編譯時,它永遠不會爲真。因此,可以肯定這不是程序員的意思:)

但是,可能有更多的java技術解釋。

3

因爲編譯器知道這是不可能的元素是一個點,所以你會得到一個編譯錯誤。

0

由於繼承樹。如果A的B繼承,那麼你可以寫B的實例

Integer i = 3; 

System.out.println(i instanceof String); // compile time error 

System.out.println(i instanceof Number); // true 

System.out.println(i instanceof Object); // true 
相關問題