6

次のコードでは、x の型は I です (ただし、x は J も実装していますが、コンパイル時には不明です)。したがって、(1) のコードがコンパイル時にエラーにならないのはなぜですか。コンパイル時に参照の型のみが考慮されるためです。

public class MyClass {
    public static void main(String[] args) {
        I x = new D();
        if (x instanceof J) //(1)
            System.out.println("J");
    }
}

interface I {}

interface J {}

class C implements I {}

class D extends C implements J {}
4

2 に答える 2

13

instanceofオブジェクトのタイプの実行時の決定に使用されます。xプログラムの実行時に本当に型のオブジェクトであるかどうかを判断しようとしてJいるため、コンパイルされます。

コンパイラが の型を認識していないと考えているため、コンパイル時にエラーが発生するはずだと考えていましたxか?

編集

Kirk Woll がコメントしたように (Kirk Woll に感謝します!)、が具象クラスであるxかどうかをチェックしていて、コンパイラがの型を判別できる場合、コンパイル時にエラーが発生します。instanceofx

Java 言語仕様から:

RelationalExpression の ReferenceType へのキャストがコンパイル時エラーとして拒否される場合、instanceof 関係式も同様にコンパイル時エラーを生成します。このような状況では、instanceof 式の結果が true になることはありません。

この例として:

import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

class SerializableClass implements Serializable
{
   private writeObject(ObjectOutputStream out) {}
   private readObject(ObjectInputStream in) {}
}

public class DerivedSerializableClass extends SerializableClass
{
   public static void main(String[] args)
   {
      DerivedSerializableClass dsc = new DerivedSerializableClass();

      if (dsc instanceof DerivedSerializableClass) {} // fine
      if (dsc instanceof Serializable) {} // fine because check is done at runtime
      if (dsc instanceof String) {} // error because compiler knows dsc has no derivation from String in the hierarchy

      Object o = (Object)dsc;
      if (o instanceof DerivedSerializableClass) {} // fine because you made it Object, so runtime determination is necessary
   }
}
于 2010-10-09T19:10:58.307 に答える
2

instanceof はコンパイル時ではなく実行時の演算子であるため、参照されるオブジェクトの実際の型を使用して評価されます。

于 2010-10-09T19:11:09.760 に答える