@634

オブジェクトの代入 その3

Advertisement

スーパークラス→サブクラス

今回はスーパークラスのオブジェクトをサブクラスのオブジェクトに代入してみる。その1の反対。
まずはじめに、単純に代入。
public class ObjCast{
    public static void main(String args[]){
        Vehicle ve = new Vehicle(new String("乗り物"));
        Car ca = new Car(new String("車"));

        //ve = ca;  ↓変更
        ca = ve;  //さかさま。

        ca.go();
        ve.go();
    }
}

class Vehicle{
    protected String name;

    public Vehicle(String n){
        name = n;
    }

    public void go(){
        System.out.println("乗り物クラスです。");
    }
}

class Car extends Vehicle{
    public Car(String s){
        super(s);
    }

    public void go(){
        System.out.println(name + "ブーンと。");
    }
}
結果。コンパイルの時点で、
ObjCast.java:7: 互換性のない型
検出値  : Vehicle
期待値  : Car
        ca = ve;  //さかさま。
             ^
エラー 1 個
なるほど。互換性がない、と。
単純に代入しようとした場合は、コンパイルエラーになった。

オブジェクトのキャスト

単純に逆にする作戦は、失敗。
次はキャストしてみよう。
public class ObjCast{
    public static void main(String args[]){
        Vehicle ve = new Vehicle(new String("乗り物"));
        Car ca = new Car(new String("車"));

        //ve = ca;  ↓変更
        ca = (Car)ve;  //さかさま&キャスト

        ca.go();
        ve.go();
    }
}

class Vehicle{
    protected String name;

    public Vehicle(String n){
        name = n;
    }

    public void go(){
        System.out.println("乗り物クラスです。");
    }
}

class Car extends Vehicle{
    public Car(String s){
        super(s);
    }

    public void go(){
        System.out.println(name + "ブーンと。");
    }
}
コンパイルは通った。実行結果。
Exception in thread "main" java.lang.ClassCastException
        at ObjCast.main(ObjCast.java:7)
ん、なるほど。例外発生。調査結果
以下、引用
あるオブジェクトを継承関係にないクラスにキャストしようとしたことを示すためにスローされます。
ふーん
よーするに、スーパークラスを、そのサブクラスのオブジェクト型にはキャストできない、と。

ただし特殊な例(?)がある。

キャストできる場合もある。

スーパークラスをサブクラスのオブジェクト型にはキャストできない、という結果がでたけど、できる場合もある。
とりあえず、以下の場合はOK。
public class ObjCast{
    public static void main(String args[]){

        //Vehicle ve = new Vehicle(new String("乗り物"));
        //↓変更

        Vehicle ve = new Car(new String("乗り物"));

        Car ca = new Car(new String("車"));

        //ve = ca;  ↓変更
        ca = (Car)ve;  //さかさま。

        ca.go();
        ve.go();
    }
}

class Vehicle{
    protected String name;

    public Vehicle(String n){
        name = n;
    }

    public void go(){
        System.out.println("乗り物クラスです。");
    }
}

class Car extends Vehicle{
    public Car(String s){
        super(s);
    }

    public void go(){
        System.out.println(name + "ブーンと。");
    }
}
結果。
乗り物ブーンと。
乗り物ブーンと。
成功。プログラムが問題なく動いた。今回は説明付き。

まず、7行目。その1サブクラスは自分から見て上(継承関係にある)のクラス型オブジェクトには代入できる。ってのがわかったから、それを使ってオブジェクト生成。
Vehicle ve = new Car(new String("乗り物"));
//↑これと       ↑これの  型が違う。
で、キャストして代入。
//Carクラスのオブジェクトも作って、
Car ca = new Car(new String("車"));

//代入。
ca = (Car)ve;
代入の時はキャストしないとコンパイルエラーになる。逆にキャストすれば代入できるし、実行エラーもなし。

Advertisement

ショートカット

634
このカテゴリのトップページに戻る
634labs
   UIコレクションギャラリー

サイト検索

Google

Web サイト内

Y!ログール