Java Generics Hell - パラメタライズドタイプ
Java Generics Hell アドベントカレンダー 5日目。
- 1日目 Java Generics Hell 序章
- 2日目 オブジェクト指向
- 3日目 リスコフの置換原則
読者の推奨スキルとしてはOCJP Silverぐらいを想定している。
パラメタライズドタイプ
Javaのジェネリクス周りは一緒くたに単に「ジェネリクス」と呼ばれている気がするが、<>の山括弧は構文上、3種類ぐらいに分類される。詳しい話はまた別途行うが、今回はパラメタライズドタイプ(パラメータ化された型)について。
パラメタライズドタイプの例を挙げよう。
List<String> list;
要するに変数宣言時の型で< > の山括弧が付いているものを指すと思ってもらいたい。
<>の山括弧でパラメータが付いているので「パラメータ化された型」というわけだ。ただ、固有名詞としては「パラメータ化された型」というのは決まりが悪いので英語でパラメタライズドタイプ parameterized type と筆者は呼んでいる。
非変性
前回、変性についての話をしたが、Javaの参照型は宣言した型と、その子の型が代入できる共変性であると説明した。配列を含め一貫して共変だが、そのせいで配列の静的な型安全性にほつれがあることも取り上げた。
通常パラメタライズドタイプでは型安全性のために非変性となっており、例えばList<Object>型の変数にはList<String>型を代入することはできない。これまた別途取り上げるがワイルドカード List<? extends Object>といったものを使うと非変性ではなくなるのだが、別途ということで我慢していただきたい。
ジェネリクスの話題はどこから始めるかが難しいのだが、ある順序で学べばすっきり全部わかるというわけにはいかない。螺旋を描くように、少しずつ全体をぐるぐると何周か巡らないと理解しにくいと考えている。
まとめ
- List<String>型といった<>つきの型をパラメタライズドタイプという
- 通常、パラメタライズドタイプは非変性
- ワイルドカードで変性が異なるものもある
今日は短め。次回は一旦構文の話をしたい。