【发布时间】:2012-10-25 09:58:33
【问题描述】:
我想创建一个通用函数,它接受任何 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);
【问题讨论】:
-
我认为你的问题是使用 Class.newInstance() 方法时没有已知的泛型参数。
-
我认为我们不需要知道泛型类型,因为无论如何它们都会在运行时被删除。请指出,如果我错了。
标签: java generics collections