2016-06-27 12 views
1

私はGuava documentationIKnowMyTypeに示すようTypeTokenを使用して、実行時に型パラメータを検索しようとしています:TypeTokenを使用して型パラメータを取得する方法は?

public class Test<E extends Enum<E>> { 

    private static enum MyEnum { 
     FIRST, 
     SECOND 
    }; 

    private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
    }; 

    public static void main(String[] args) { 
     Test<MyEnum> container = new Test<>(); 
     System.out.println(container.enumType.getRawType()); 
    } 
} 

私はこのコードを実行すると、私は出力としてclass java.lang.Enumを取得します。代わりにclass MyEnumが得られないのはなぜですか?

答えて

5

この「ハック」は実行時の値Testの値では機能しません。宣言

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) { 
}; 

ので、TypeTokenまで、ここで

Test<MyEnum> container = new Test<>(); 

あなたTestクラスをインスタンス化する際に、Javaが推論型引数を伝達するための方法はありません

は考えを持っていないものをEべき参照する。

Javadoc状態

構築Tの新しいタイプのトークン自由型変数declaringClassの文脈で を解決中。

クライアントは空の匿名サブクラスを作成します。このようにすると、 型のパラメータが匿名クラスの型階層に埋め込まれるため、消去時に実行時に を再構成することができます。

あなたがする必要があります。今

Test<MyEnum> container = new Test<MyEnum>() { 
}; 

クラスはその一般的なスーパークラスに関する情報を保持するので、上記TypeTokenインスタンス化でgetClass呼び出しがEMyEnumとして解釈されるために十分なコンテキストを提供します。

+0

わかりません。あなたの答えには「サンプル」とは何ですか? 'Sample extends Test'サブクラスを作成して、' Sample.enumType'を調べることができると言っていますか? – Gili

+0

@Gili申し訳ありませんが、自分のテストクラスを使用していました。 'Sample'はあなたの' Test'です。 'Test'の匿名サブクラスを作成します。 –

+0

それは動作します。ありがとうございます! :) – Gili

関連する問題