2009-05-26 10 views
9

構築時に渡されるジェネリックパラメータタイプをパラメータに格納する方法はありますか。私の目標:クラスのジェネリックをフィールドJavaに格納する

class generic<T> { 
    Class<T> type; 
    public generic() { 
     super(); 
     this.type = //Something that gets class from T 
    } 
} 

私は現在やっている何がこれです:

class generic<T> { 
    Class<T> type; 
    public generic(Class<T> type) { 
     super(); 
     this.type = type; 
    } 
} 

二度クラスを指定する必要が愚かなようだが、私はそれを行うにはどのように他のよく分かりません。私はこれが反映されている可能性があると思うが、私はそれについてまだ調べていない。より簡単な方法はありますか?そうでない場合(脇に)なぜ情報の損失ですか?

+0

ジェネリックを使用している場合、なぜそのクラスを必要としますか?これには奇妙な臭いがあります。 – Instantsoup

+0

ジェネリックはコンパイルタイプのフィーチャなので、実行時にジェネリックパラメータにアクセスする必要はありません。 –

答えて

10

のJavaのジェネリックはType Erasure

ジェネリック型がインスタンス化されると、 コンパイラは によって型消去と呼ばれる技術をこれらの型を変換して実装されているので - コンパイラはに関連するすべての 情報を削除し プロセスクラス を入力し、クラス内に引数を入力するか、 メソッドを入力します。タイプ消去により、Java ジェネリックを使用するアプリケーションは、 とバイナリ互換性を維持します。 ジェネリックの前に作成された のJavaライブラリとアプリケーション。

3

これらのタイプは実行時には保持されないため、パラメータとして使用することはできません。 JavaのGenericsは厳密にはコンパイル時のコンセプトです(下位互換性の理由から)。これはType Erasureと呼ばれます。

クラスオブジェクトが型パラメータを受け取る理由の1つは、この問題を回避することです。そのため、クラスオブジェクトを使用してプログラムで型を表すことができます。

8

コンストラクタの代わりに型推論を使用して静的作成メソッドを使用する場合は、その型を2回指定する必要はありません。

final class Generic<T> { 
    private final Class<T> type; 
    private Generic(Class<T> type) { 
     super(); 
     if (type == null) { 
      throw new NullPointerException(); 
     } 
     this.type = type; 
    } 
    public static <T> Generic<T> newInstance(Class<T> clazz) { 
     return new Generic<T>(clazz); 
    } 
} 
... 
    someFunction(Generic.newInstance(SomeType.class)); 

もちろん、結果を変数に格納する場合は、おそらくこの型を繰り返すことになります。

関連する問題