instanceof
オブジェクトのタイプの実行時の決定に使用されます。x
プログラムの実行時に本当に型のオブジェクトであるかどうかを判断しようとしてJ
いるため、コンパイルされます。
コンパイラが の型を認識していないと考えているため、コンパイル時にエラーが発生するはずだと考えていましたx
か?
編集
Kirk Woll がコメントしたように (Kirk Woll に感謝します!)、が具象クラスであるx
かどうかをチェックしていて、コンパイラがの型を判別できる場合、コンパイル時にエラーが発生します。instanceof
x
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
}
}