凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 46956
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

文字列リテラルシリーズが長くなってきたので息抜き。

タイトルだけでかなり奇怪ですが、順を追って説明します。

メソッドローカルなジェネリクス型パラメータ

通常、ジェネリクスの型パラメータというのはクラスの宣言に付随するものが利用されます。

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
コメント
  • # コンバータにジェネリクスを使ってみると
    凪瀬 Blog
    Posted @ 2008/02/27 20:11
    コンバータにジェネリクスを使ってみると
タイトル
名前
Url
コメント