The HIRO Says

If you smell what The HIRO is cooking!!!

generics に関する配列とリストの違い(2/3)−実行時の型チェック

配列と generic なリストでは、実行時の型チェックについて以下の違いがあります。

  1. 配列は、実行時に型チェックを行える。
  2. リストは、実行時に型チェックを行えない。

どういうことなのか、以下で説明します。


配列の場合

配列は、コンパイル時には型チェックを行いませんが、一方で実行時に型チェックを行う仕様になっています。
コードで具体的に見てみましょう。

    // 配列は covariant なので、このような定義は可能。
    Object[] array = new Integer[2];

    array[0] = 1;
    // コンパイル時にはエラーにならないが、実行時に ArrayStoreException が発生する。
    array[1] = "2";

言い換えると、実行するまで型エラーを検知できないという問題があるわけです。
(これが、generics の策定につながっていくわけです。)


リストの場合

一方で generic なリストは、コンパイル時に型チェックを行います。
で、コンパイルに成功すると、コンパイラが binary に対して、キャストの情報を自動的に(勝手に)追加してくれます。
一方で、(配列の場合のような)実行時の型チェックを行うために必要な情報は、binary に加えられません。
これは、「コンパイル時に既に型チェックしているから、実行時まで引きずる必要はないでしょう」ということのようです。


具体的な例としては…
記述量が多くなってしまうため、次回に回します。(・ω・)