cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

ジェネリクスメソッドの初めのって何?

このメソッドの宣言の意味がわかりません。 public static List simpleFind(String sql, ResultSetBeanMapping mapping) throws SQLException { 型Tのマップを受け取って型Tの要素が入ったリストが返されているのであろうというのは 何となくわかります。 しかし、返値の前にさらにをつけているのは何なのかわかりません。 あと、メソッドの中で T bean = mapping.createFromResultSet(rs); とあるのですが、メソッドの中での型宣言のときはではなくTでよいのでしょうか?

http://toro.2ch.net/test/read.cgi/tech/1361516065/99

メソッドのパラメータ化

さて、次はメソッドの方です。クラスがパラメータ化されていなくても、メソッドだけをパラメータ化することができます。

メソッドをパラメータ化するには public や private や static などの後、戻り値の前に <パラメータ名> を記述します。 クラスの場合はクラス名の後だったのに対し、メソッドではメソッド名の前になります。

次の例は java.util.Collections クラスの fill メソッドの定義です。

public static boolean replaceAll(List list, T oldVal, T newVal);
T がパラメータとなる型です。メソッドの中では T は普通の型のように使えるのはクラスのときと同様です。

java.util.Collections クラスや java.util.Arrays クラスのように static メソッドばかりのクラスはインスタン化しないので、このようにメソッドをパラメータ化することが多いようです。

先ほどと同様にワイルドカードを用いることもできます。次の例は同じく Collections クラスの copy メソッドです。

public static void copy(List dest, List src);
T の派生クラスは T のスーパクラスにはコピーできるということです。

単なるワイルドカードも使えます。この場合はどんなクラスでもいいので、戻り値の前のパラメータ表記は必要ありません。

ワイルドカードの例として Collections クラスの reverse メソッドです。リストの並び順を変えるだけなので、List の要素はどんなクラスのオブジェクトでもいいわけです。

public static void reverse(List list);
メソッドだけをパラメータ化することはあまりないかもしれませんが、static メソッドだけのユーティリティクラスなどで重宝しそうです。

http://www.javainthebox.net/laboratory/J2SE1.5/LangSpec/Generics/Generics.html

メソッドの総称型 メソッドのみに総称型を適用した定義を行うことも出来る。[2007-06-12] 戻り値の型の直前に「<仮型引数, 仮型引数…>」を置くだけ。後はクラスの場合と同様。

http://www.ne.jp/asahi/hishidama/home/tech/java/generics.html

すなわち、メソッドでジェネリクスを使うときには初めにを宣言するものらしい。
ちなみに総称型というらしい。