2

私は次のタイプを持っています:

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}
}

ただし、 T 自体がジェネリック クラスである場合、これを呼び出すことはできないようです。

GenericClass<List<String>> g = new GenericClass<>(???);

usingList.classはコンパイルされず、List<String>.class無効な構文です。Class<List<String>>コンストラクターに渡すa のインスタンスを取得するにはどうすればよいですか?

4

3 に答える 3

2

これは簡単な解決策です..醜さを完全に隠します。ここでのアプローチは、結果の型を暗黙的にバインドし、それを渡された生のクラスから分離することです。

public class GenericClass<T> {
    public GenericClass(Class<T> cls) {}

    // static constructor;
    //    - hides unchecked ugliness, & implicitly binds 'nicely typed' to result.
    //
    public static <T>  GenericClass<T> create (Class<? super T> clazz) {
        // ugly cast is hidden in here;  no type checking.
        Class<T> clazz_ = (Class<T>)(Class) clazz;
        return new GenericClass( clazz_);
    }
}

使用法:

GenericClass<List<String>> g = GenericClass.create( List.class);

今のところ「渡されたクラス」のクラズを​​制限しました? super Tが、これが厳しすぎる場合は、制限を緩和してパラメーターをちょうどClass<?> clazz.

このソリューションは、私の IDE で (少なくとも迅速に) テストされており、うまく機能しているようです。長期的には、これがあなたが抱えている設計上の問題を解決するための最良の方法であるかどうかはわかりませんが、差し迫った質問を解決するための最も適切な方法であることは間違いありません.

于 2013-09-11T12:49:52.703 に答える
1

どうですか

GenericClass<List<String>> g =
    new GenericClass<>((Class<List<String>>)(Class<?>)ArrayList.class);
于 2013-09-11T21:38:09.840 に答える
0

次のようにコンストラクターを宣言することもできます

public <E extends T> GenericClass(Class<E> cls)

次に、List.class と List の任意の子をコンストラクターを介して渡すことができます。

于 2013-09-11T13:21:20.840 に答える