我想创建一个通用函数,该函数采用任何 Map 和一个 String 键,如果该键不存在于地图中,那么它应该创建一个值类型的新实例(已传递)并将其放入地图中然后把它返还。
这是我的实现
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);