型消去とは?
かたしょうきょ
型消去とは、コンパイル時の具体的な型情報を実行時に隠蔽し、共通インターフェースとして扱えるようにするプログラミング技法です。
型消去(type erasure)とは、プログラミングにおいてコンパイル時に存在する具体的な型情報を「消し」、実行時には共通の抽象インターフェース越しにオブジェクトを扱えるようにする技法です。ジェネリクス(総称型)やトレイトオブジェクト、インターフェースを活用する言語でよく使われます。
たとえばRustでは、異なる具体的な型が同じトレイトを実装している場合、それらをBox<dyn Trait>(トレイトオブジェクト)としてひとつのコレクションに格納できます。このとき、元の具体型の情報は「消去」され、トレイトのメソッドだけが仮想テーブル(vtable)経由で呼び出されます。
Javaのジェネリクスも型消去の典型例で、コンパイル後のバイトコードには型パラメータの情報が残らず、実行時にはObjectとして扱われます。これにより後方互換性が保たれますが、実行時の型情報取得には制限が生じます。
型消去の主なメリットとデメリットは次の通りです。
- メリット:コードの汎用性・抽象化が高まり、異なる型を統一的に扱える
- メリット:バイナリサイズの増大を抑えられる(モノモーフィズムの回避)
- デメリット:実行時の動的ディスパッチによるパフォーマンスオーバーヘッド
- デメリット:実行時に元の型情報を取り出せない場合がある
型消去はSwiftのanyプロトコル、RustのBox<dyn Trait>、Javaのジェネリクスなど多くの言語・フレームワークで見られる重要な概念です。
使い方・例文
Rustで複数の異なる型を同一のVecに格納したい場合に「Box<dyn Draw>を使って型消去し、一様に描画処理を呼び出す」という表現が使われます。Javaの文脈では「ジェネリクスは型消去によってコンパイル後に型情報が失われる」と説明されます。
この用語をシェア
最終更新: