文字列リテラルシリーズが長くなってきたので息抜き。
タイトルだけでかなり奇怪ですが、順を追って説明します。
メソッドローカルなジェネリクス型パラメータ
通常、ジェネリクスの型パラメータというのはクラスの宣言に付随するものが利用されます。
public class Hoge <T> {
この他にstaticメソッドでのジェネリクス型などで用いられている、
メソッドローカルのジェネリクスの型パラメータというものがあります。
public static final <T> Set<T> emptySet() {
例はjava.util.CollectionsクラスのemptySetメソッドです。
宣言に対して、使用例はこんな感じ。
Set<String> emptySet = Collections.<String>emptySet();
これらのメソッドローカルのジェネリクスの型パラメータはstaticメソッドでは比較的用いられるのですが、
インスタンスメソッドでも用いることができます。ただし、必要となるシチュエーションはレアだとは思いますが。
public <T> void hogeMethod() {
同様にコンストラクタでもローカルのジェネリクスの型パラメータを指定することができます。
public class Hoge {
public <T> Hoge() {
// T型がコンストラクタ内で使える
}
public static void main(String[] args) {
Hoge hoge = new <String> Hoge();
}
}
もっとも、言語的にはコンストラクタローカルのジェネリクスの型パラメータが使用可能ではありますが、
使用用途があるのか激しく疑問ではありますね。
Enum型のコンストラクタ
さて、話は一転してEnum型を拡張する話。JavaのEnum型はメソッドを持たせたりと拡張することができます。
public enum Hoge {
Enum1,
Enum2,
Enum3;
/** Enumにメソッドを定義 */
public void hoge() {
System.out.println("hoge");
}
}
そして、コンストラクタも持たせることができますし、フィールドも持たせることができます。
public enum Hoge {
// Enumの定義ではコンストラクタに引数を渡す
Enum1("壱"),
Enum2("弐"),
Enum3("参");
/** フィールド定義 */
private String hoge;
/** コンストラクタ */
private Hoge(String hoge) {
this.hoge = hoge;
}
/** Enumにメソッドを定義 */
public void hoge() {
// フィールドの内容を出力するようにしてみた
System.out.println(this.hoge);
}
}
Enumとジェネリクスを混ぜる
言語上は以下のようにEnumのコンストラクタにローカルな型パラメータを宣言できます。
public enum Hoge {
Enum1("壱"),
Enum2("弐"),
Enum3("参");
/** フィールド定義 */
private String hoge;
/** コンストラクタ */
private <T> Hoge(String hoge) {
this.hoge = hoge;
}
}
しかし、このEnumのコンストラクタの型パラメータにジェネリクスの型パラメータを渡す術がありません。
以下のような記述はコンパイルエラーとなります。
<String>Enum1("壱"),
…。
まぁ、使い道がないのでどうでもいいのですが。
もっとジェネリクスを知りたい方へ
過去にジェネリクスのマニアックなエントリを挙げているので、参考にしてみてください。
投稿日時 : 2008年2月25日 18:39