2010-12-16 6 views
6

私はこれを読んでいる:
http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.20.2互換性のない2つのクラスに使用すると、 `instanceof`エラーが` false`を返すのではなく、なぜですか?

彼らは言う:instanceof式はElementのインスタンスが正しくないためである

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 
       } 
     } 
} 

は、プログラム例を考えてみましょうまたは可能な任意のサブクラス(ここには何も表示されていません)おそらくPointのサブクラスのインスタンスになる可能性があります。

instanceofがfalseを返すのではなく、なぜこれがエラーになるのですか?

おかげで、

JDelage

+0

強く型付けされてコンパイルされているのとは対照的に、ほとんどの場合、大まかに型付けされ、ほとんどが解釈された言語(例:ほとんどのBASIC)で以前の経験があるかもしれないようです。ほとんどの場合、解釈される言語では、実行時にほぼすべての型のような検証が行われます。しかし、コンパイルされた言語では、コンパイラはかなりの "タイプと実行フローの分析"を行うことができます。その結果、決して実行することができない経路を発見した場合、その経路のコード(すなわち、デッドコード除去)を除去することができる。成功しない操作が見つかった場合はエラーが発生します。 – chaotic3quilibrium

答えて

10

instanceof Bのインスタンスを書くことができます。コンパイラはコンパイル時にこの条件が間違っていることを発見することができます(それは間違っている)。速い失敗は良い習慣であることを常に覚えておいてください。それはあなたに多くの時間と神経を節約します。

+1

ありがとう - これはこの決定の合理的な説明です。実行時に 'false'という結果を出すのではなく、コンパイル時にエラーになるのは完全に意味があります。 – JDelage

10

あなたはそれが真実でないことをコンパイル時に知っているので、私は、と思います。したがって、これは、プログラマがしかし:)

を意味するものではありませんと仮定しても安全だ、おそらくよりJavaの技術的な説明があります。

3

コンパイラは、それはあなたがコンパイル・エラーが発生しますので、ポイントとなる要素には不可能であることを知っているので。そのため、継承ツリーの

0

。 Aは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 
関連する問題