【かたしょうきょ】
型消去 とは?
💡 「設計図は捨てて、完成品だけ渡す」コンパイル後の型情報の消え方。
📌 このページのポイント
- コンパイル時の型チェックが終わると型情報が消える
- JavaのGenericsは型消去で実装されているため、実行時にList<String>かどうか判別できない
- 後方互換性を保つために採用された設計
- TypeScriptも実行時にはJavaScriptとなり型情報が消える
型消去って、型情報がどこかに消えちゃうってこと?
じゃあ実行時に `List<String>` かどうかって確かめられないの?
そうなんだ。`instanceof List<String>` みたいなチェックはコンパイルエラーになるよ。実行時にわかるのは「Listである」ということだけで、「Stringのリストである」とは確かめられないんだ。
なんでそんな設計にしたの?
型消去って Java だけなの?
TypeScriptも型消去を使っているよ。TypeScriptのコードをコンパイルするとJavaScriptになって、型アノテーションは全部消えるんだ。一方でC#のGenericsは「具体化」方式で実行時にも型情報が残るから、動作が違うんだよ。
📖 おまけ:英語の意味
「Type Erasure」 = 型消去
💬 erase は「消す」という意味で、コンパイル時に存在した型情報が実行バイトコードから消えてしまうことをそのまま表した言葉だよ。