我想将Integer
或Double
存储为Number
,并将其HashMap
存储到Number
,然后检索它们而不进行投射。原因是我最终会有很多不同的子类型(我只使用Integer
/ getFromMap()
进行说明),而且我不想在不同的时候编写新方法引入了子类型。我是否可以在Double
或Integer
进行结构调用public class MapOfContent {
static Map<String, Number> hm = new HashMap<String, Number>();
public static void main(String[] args) {
addToMap(hm, Integer.valueOf(3), "An Integer");
addToMap(hm, Double.valueOf(3.4), "A Double");
Double d;
d = (Double) getFromMap(hm, "A Double");
//d = getFromMap(hm, "A Double");
System.out.println("Result-> " + d);
}
private static void addToMap(Map<String, ? super Number> hashmap, Number c, String key) {
hashmap.put(key, c);
}
private static <T> Number getFromMap(Map<String, ? extends Number> hashmap, String cmsKey) {
return hashmap.get(cmsKey);
}
}
而不必进行展示?
{{1}}
答案 0 :(得分:2)
实际上没有办法让这种方法真正具有类型安全性;如果您尝试(Double) getFromMap(hm, "An Integer")
怎么办?那应该失败。
一种可能的替代方法可能是使用实际的Class
对象作为关键字,例如使用Guava ClassToInstanceMap
:
ClassToInstanceMap<Number> map = MutableClassToInstanceMap.create();
map.putInstance(Integer.class, Integer.valueOf(3));
map.putInstance(Double.class, Double.valueOf(3.4));
Double aDouble = map.getInstance(Double.class); // no cast required
答案 1 :(得分:0)
如果您要在集合中存储不同类的对象,并且在获取它们时,您需要访问其实际类型的字段/方法,而不仅仅是它们的共同祖先,然后是否。
在某个地方会有一个明确的演员阵容,你可以做的最好的事情就是将其深深地隐藏起来并将其隐藏在代码的所有其他部分,就像ClassToInstanceMap
那样。