型総称性

オブジェクト指向に基づくプログラミングでは数多くのクラスを扱います。これらのクラスは個々のさまざま処理を実現するために必要となってくるものです。一方、さまざまなクラスに対して同じような処理を行いたい場合があります。リスト・スタック・キューなどは、殆どのクラスのオブジェクトがこれらの処理対象になりえます。

例えばリスト処理をDelphiで実現したければ、大元のクラスTObjectに対してリスト処理するクラスTObjectListを定義しておけば、継承による多態性が利用できるので、すべてのクラスに対してリストが使えるようになります。ここで特定のクラスTMyObjectについてリスト処理する必要があったとします。その場合にもTObjectListをそのまま使うことができますがTOjectListはTMyObject以外のものも扱える点が問題になります。例えば別のクラスTOtherObjectのオブジェクトを誤ってリストに加え、TMyObjectのつもりで取り出すと実行時エラーになります。できればコンパイル時にチェックしたいものです。

そこで、一つの解決策としては改めてTMyObjectのみを扱うクラスTMyObjectListを定義することが考えられます。しかしこれではクラスごとにリスト処理するクラスを定義しなければならず、単にタイプセーフにするためだけの代償としては大きいと感じます。

タイプセーフを保持しながらリスト処理の記述を一回限りで済ませたい。そういった要望に答えるのが型総称性です。古くはAdaのGenericにもありますが、C++ではテンプレート、JavaではJava
Genericがこれに相当します。

オブジェクト指向ではない言語Adaにもあることからもわかるように、型総称性はオブジェクト指向とは異なるパラダイムです。しかしオブジェクト指向で発生する多くのクラスを型総称性で統一的に扱えるという位置づけをするとこの2つは車の両輪となって働くものです。今後型総称性は台頭してくると考えられます。

キーワード:型総称性テンプレートJava genericパラメタライズドクラス