オブジェクト参照のキャストに関するルール:
・キャストに関するルールの一部には、参照のデータ型(コンパイル時に取得可能)に関係するものがあり、そうしたものはコンパイル時に検証される。
・キャストに関するルールの一部には、オブジェクトのデータ型(コンパイル時に取得不可能)に関するものがあり、そうしたものは実行時にのみ検証できる。
コンパイル時には次のルールが満たされている必要がある:
・ソース型およびターゲット型の双方がクラスである場合、一方のクラスは他方のサブクラスになっている。
・ソース型およびターゲット型の双方が配列である場合、双方の配列要素のデータ型は基本データ型ではなくオブジェクト参照になっている。また、これら配列のオブジェクト参照のデータ型は、ソース側のものからターゲット側のものに変換可能である。
・final指定されていないオブジェクトとインタフェースとのキャストは常に可能である。
コンパイル時に検証されたキャストであっても、実行時に次のルールが満たされているかが検証される:
・ターゲット側の型がクラスである場合、代入されるオブジェクトはターゲット側の型と同一であるかそのサブクラスである必要がある。
・ターゲット側の型がインタフェースである場合、代入されるオブジェクトは、ターゲット側のインタフェースを実装している必要がある。
キャストする参照変数のデータ型が不正な場合、JVMはClassCastExceptionという例がをスローする。