10

次のように指定された POJO があります。MyClass<U>ここUで、 はジェネリック型パラメーターです。クラス参照を受け入れ、Class<T>タイプのマップを作成するユーティリティ メソッドを作成しようとしていますMap<String, T>(作成するマップを受け入れます)。

このメソッドは次のように実装されます。

static void populateMap(Map<String, T> map, Class<T> type) {

    ...

    // Parses into the specified type and returns an object of that type.
    T obj = parse(..., type);
    map.put (key, obj);
    ...

    return map;
}

これはうまくコンパイルされます。私の呼び出し元では、MyClass(タイプに関係なく) 任意のインスタンスを値としてマップに入力しようとしています。したがって、次のコードを使用します。

// Loses type information
Map<String, MyClass<?>> m = new HashMap<>();
populateMap(m, MyClass.class);

これはコンパイルされません。コンパイル エラー:

タイプ ...のメソッドpopulate(Map<String,T>, Class<T>)は引数に適用できません(Map<String,MyClass<?>>, Class<MyClass>)

どうすればこれを修正できますか?

4

2 に答える 2

2

Because of type erasure, there's no such thing as a Class object representing a generic type, you can only use a raw type such as MyClass (with no generic parameter).

One possible workaround is exceptionally ugly: declare or cast m as Map<String, MyClass> and prepare to face a tsunami of warnings and errors (errors can be fixed by casting, and become multiple warnings).
For a probably better workaround, refer to Paul's answer :)

Also see Getting a java.lang.Class with generics

于 2013-09-22T07:03:40.030 に答える