マップと文字列キーを受け取るジェネリック関数を作成したいのですが、キーがマップに存在しない場合は、値型(渡される)の新しいインスタンスを作成してマップに配置する必要があります。それを返します。
これが私の実装です
public <T> T getValueFromMap(Map<String, T> map, String key, Class<T> valueClass){
T value = map.get(key);
if (value == null){
try {
value = valueClass.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
map.put(key, value);
}
return value;
}
通常の(ジェネリックではない)リストを値型として使用すると機能します。
Map<String,List> myMap;
List value = getValueFromMap(myMap, "aKey", List.class) //works
ただし、ジェネリック型リストではありません
Map<String,List<String>> myMap;
List<String> value = getValueFromMap(myMap, "aKey", List.class) //does not work
Map<String, T>
また、マップパラメータを変更してジェネリックにしようとすると、次のMap<String, T<?>>
ように文句を言います。the type T is not generic; it cannot be parameterized with arguments <?>
ジェネリックパラメータ自体をジェネリックにすることはできますか?
上記の要件で関数を作成する方法はありますか?
〜更新
皆、洞察に満ちた答えをありがとう。
受け入れられたソリューションがこのコードのすべての値型で機能することを確認しました
Map<String, Map<String, List<String>>> outer =
new HashMap<String, Map<String,List<String>>>();
Map<String, List<String>> inner = getValueFromMap(outer, "b",
(Class<Map<String, List<String>>>)(Class<?>)HashMap.class);
List<String> list = getValueFromMap(inner, "a",
(Class<List<String>>)(Class<?>)ArrayList.class);