![](/img/trans.png)
[英]Can I avoid explicit cast with “generics” or better “design patterns”?
[英]Can I avoid This Cast with Generics?
我想将一个从Number
扩展的Integer
或Double
存储到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);
}
}
没有办法真正使这种方法真正的类型安全; 怎么试试(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
如果您要在集合中存储不同类的对象,并且在获取它们时,您需要访问其实际类型的字段/方法,而不仅仅是它们的共同祖先,然后是否。
在某个地方会有一个显式的ClassToInstanceMap
转换,你可以做的最好的事情就是将其深入并将其隐藏在代码的所有其他部分,就像ClassToInstanceMap
那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.