The HIRO Says

If you smell what The HIRO is cooking!!!

generics を再考する

J2SE v1.5(Tiger)から新たに追加された generics
端的に言うと List
そもそもこれの役割が何なのかを、改めて見直してみました。


役割

generics の役割は、大きく次の2つにまとめられそうです。

(1)キャストをなくす

J2SE 1.4 以前では、List や Map などの Collection は、値を取得するときにキャストが必要です。
これは、ThreadLocal などの何でも扱えるクラスの場合も同様です。
ただ、実際にコードを組んだ人ならばわかるでしょうが、これが色々と面倒くさい。

  1. 定型処理なので、書くこと自体が面倒。
  2. うっかりミスで型を書き間違えるとバグに。
  3. ソースの可読性が落ちる。(ここはプログラマーの好みが分かれるかも)
  4. キャストするということは、ClassCastException の可能性があるということになる

どうせ中身が分かっているんだったら、余計なキャストをなくせないか?
これが、1つ目の役割と言えるでしょう。

(2)中身の型を保障する

(1)から、「中身が分かっているんだったら」、初めて余計なキャストをなくせるとも言えます。
このことは、中身をわかった状態にする、言い換えると中身の型を保障できるようにしておくことが必要だという事実にたどり着きます。
つまり、中身の型を保障する仕組みが2つ目の役割と言えるでしょう。


型保障が generics を複雑にする!

generics を調べていくと、 とか とか、 とか、複雑な型パラメータに出くわします。
これは、型保障に柔軟性をもたせるための機能なのですが…これが非常にわかりづらい!
これらについては、今後1つずつ触れていこうと思います。


参考資料

(1)Effective Java だけでは不十分だったので、こちらもどうぞ。

Java Generics and Collections: Speed Up the Java Development Process

Java Generics and Collections: Speed Up the Java Development Process

(2)generics の FAQ
http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html