Java 入門

ホーム > ジェネリックス > サブタイプ

サブタイプ

ここでは、サブタイプの問題について触れておきます。 サブタイプというのは、言い換えればサブクラスあるいは派生クラスということですが、 ジェネリックスの場合、通常のオブジェクトと異なる動作をするので注意が必要です。

Person クラスから SalesPerson クラスが派生しているとします。

このとき、次のように SalesPerson オブジェクトから Person クラスへのキャストは安全に行うことができます。 なぜなら SalesPerson クラスは Person クラスから派生しているので、SalesPerson は Person でもあるからです。

一般的に、このようにスーパークラスへのキャストは安全に行うことができます。これをアップキャストといいます。

では、ジェネリックスで定義された型ではどうなるでしょうか?

次の例をみてください。

Box<String> sbox = new Box<String>(new String("Hello"));
Box<Object> obox = sbox;

上の例では、Box<String> 型の sbox を Box<Object> に代入しようとしています。

String は Object でもあるわけですから、これは一見正しいように見えますが、実はこのコードはコンパイルできません。

もし、Box<Object> を通して Box<String> を操作できたとしたら、Box<String> の中に Integer など他の型のオブジェクトが混じり込むことになってしまいます。

これでは、型付けを強めるためにジェネリックにした意味がなくなってしまいます。

結局のところ、String が Object のサブタイプだとしても、Box<String> は Box<Object> のサブタイプにはならない、というわけなのです。

ホーム > ジェネリックス > サブタイプ