【かたしょうきょ】

型消去 とは?

💡 「設計図は捨てて、完成品だけ渡す」コンパイル後の型情報の消え方。
📌 このページのポイント
型消去(Type Erasure) ソースコード List<String> 型情報あり コンパイル コンパイラが 型チェック 安全を確認 ✓ 型消去 バイトコード List(Object) 型情報なし 実行時に型情報が消えた結果… instanceof List<String> は コンパイルエラーになる instanceof List は OK (生の型なら判定できる) TypeScript も JS にコンパイルすると型情報が消える
コンパイル時の型チェック後に型情報が削除される型消去の仕組み
ひよこ ひよこ

型消去って、型情報がどこかに消えちゃうってこと?

ペンギン先生 ペンギン先生

そうだよ。コンパイルが終わると、型情報が実行ファイルから取り除かれるんだ。JavaのGenericsが典型例で、`List<String>` と書いても、実行時には `List` として扱われるよ。

ひよこ ひよこ

じゃあ実行時に `List<String>` かどうかって確かめられないの?

ペンギン先生 ペンギン先生

そうなんだ。`instanceof List<String>` みたいなチェックはコンパイルエラーになるよ。実行時にわかるのは「Listである」ということだけで、「Stringのリストである」とは確かめられないんだ。

ひよこ ひよこ

なんでそんな設計にしたの?

ペンギン先生 ペンギン先生

Java 5 でGenericsが導入されたとき、それ以前に書かれた古いコードとの互換性を保つためだよ。型消去のおかげで、Genericsを知らない古いコードでも新しいコードのリストを受け取れるんだ。

ひよこ ひよこ

型消去って Java だけなの?

ペンギン先生 ペンギン先生

TypeScriptも型消去を使っているよ。TypeScriptのコードをコンパイルするとJavaScriptになって、型アノテーションは全部消えるんだ。一方でC#のGenericsは「具体化」方式で実行時にも型情報が残るから、動作が違うんだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「型消去」って出てきたら「コンパイル後に型情報が消えるJavaの仕組み」と思えればだいたいOK!
📖 おまけ:英語の意味
「Type Erasure」 = 型消去
💬 erase は「消す」という意味で、コンパイル時に存在した型情報が実行バイトコードから消えてしまうことをそのまま表した言葉だよ。
← 用語集にもどる