配列の共変性

配列の共変性とは、狭い型の配列から広い型の配列への変換(代入も変換の一種)に伴って、広い型の配列の型が狭い型に変わることです。尚、親クラスと子クラスを比較した場合、親クラスが広い型で子クラスが狭い型です。

以下では Java の配列を例にとって考えてみましょう。この例では、Integerクラスが狭い型、Numberクラスが広い型です。Java ではObjectクラスが最も広い型です。

  1. Integer[] integer = {0};
  2. Number[] number = integer;
  3. System.out.println(number[0] instanceof Integer);
  4. number[0] = 0.1;

 1.Integerクラスの配列integerを初期化します。
 2.狭い型(Integerクラス)の配列integerが広い型(Numberクラス)の配列numberに変換(ここでは代入)されます。
 3.広い型(Numberクラス)の配列要素number[0]の型が狭い型(Integerクラス)に変わったのを確認します。
 4.Integerクラスのインスタンスになったnumber[0]に浮動小数点数を代入しているので実行時に例外が発生します。本当はコンパイル時にエラーになって欲しいのですが。。。

 注意)広い型の変数に狭い型の変数を代入できることが共変性ではありません。

実行結果

true
Exception in thread "main" java.lang.ArrayStoreException

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中