にんにんにん

エンジニアな日々を書いていきます

参照型のキャスト

Javaにおける、スーパークラスとサブクラスの関係性について勉強したので、メモ

class Pet {
    中身は省略
}

class RobotPet extends Pet{
    中身は省略
} 

があったとして、

Pet p = new RobotPet();

スーパークラス型の変数は、サブクラスのインスタンスを参照することができる

これは、暗黙で

Pet p = (Pet) new RobotPet()

と、スーパークラスにキャストされているからである

逆に、

RobotPet r = new Pet();

とするとき、暗黙のキャストは行われず、コンパイルエラーとなる

この場合は明示的なキャスト

RobotPet r = (RobotPet) new Pet();

が必要 この時のキャストのことをダウンキャストと呼ぶ

不用意にダウンキャストを行って、下位クラス型の変数に上位クラス型のインスタンスを参照させることは、原則として避けるべきとされている

なぜならば、rの参照先は、サブクラスRobotPetではなく、スーパークラスPetであるため、サブクラスのメソッドを実行しようとするとエラーが走る。しかも、コンパイルエラーではなく、実行時エラーとなるため、コンパイル時にエラーが検知できないためである

TextView textView = (TextView) findViewById(R.id.hoge);

textViewに対して、TextViewが持つメソッドを実行しようとしてエラーになる可能性があり、本来この書き方はよくないのだなとわかる